2017-08-15 28 views
1

我有一个expressJS web应用程序与路由设置。我还有几个函数存在于jsdom环境中,因为我想利用各种jquery函数。ExpressJS + jsdom - 范围问题

我遇到的问题是我需要在expressJS作用域级别的jsdom中调用一个函数。

我真的希望这是可能的某种方式,因为这将大大简化我的生活。

例如:

// express 
app.get('/someRoute', function(request, response){ 
    myFunction(request.data, function(getResponse){ 
     response.status(200).send(getResponse); 
    } 
}) 

//jsdom 
jsdom.env('html', function(err, window) { 
    ..... 

    myFunction(a, callback){ 
     // <some jquery-only feature that I need> 
     callback(a); 
    } 
}) 

回答

0

是的,你可以,你有几种选择。我想这两个部分将在不同的文件中,否则你可以在文件的顶部定义一个变量,并在jsdom内指定它。根据你的应用程序的大小,你可能想要选择一个或另一个:

快速但不是很好的:在jsdom.env函数里面,定义一个全局函数,它可以从ExpressJS路由器访问。

// express 
app.get('/someRoute', function(request, response){ 
    global.myJSDomFunction(request.data, function(getResponse){ 
     response.status(200).send(getResponse); 
    } 
}) 
//jsdom 
jsdom.env('html', function(err, window) { 
    ..... 

    global.myJSDomFunction = myFunction(a, callback){ 
     // <some jquery-only feature that I need> 
     callback(a); 
    } 
}) 

好的,一般不建议定义全局变量,以保持一个健全的体系结构,不会产生名称冲突。让我们尝试定义第三个文件,您可以在其中附加功能:

// express 
const fnContainer = require('../fnContainer') 
app.get('/someRoute', function(request, response){ 
    fnContainer.myJSDomFunction(request.data, function(getResponse){ 
    response.status(200).send(getResponse); 
    } 
}) 

//jsdom 
const fnContainer = require('../fnContainer') 
jsdom.env('html', function(err, window) { 
    ..... 

    fnContainer.myJSDomFunction = myFunction(a, callback){ 
    // <some jquery-only feature that I need> 
    callback(a); 
    } 
}) 

//fnContainer.js 
module.exports = { 
    myJSDomFunction: null, 
} 

最好的方法是根据您的情况改进名称。您可以有更复杂的结构,最后,您必须将此功能保存在可从Express.js路径内访问的位置。