ExpressJS + jsdom - 范围问题

时间:2017-08-15 23:20:06

标签: jquery node.js express jsdom

我有一个设置路线的expressJS网络应用程序。由于我想利用各种jquery函数,我在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);
    }
})

1 个答案:

答案 0 :(得分: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路径内部访问的位置。