Node.js 在处理程序函数中使用节点js域

Node.js 在处理程序函数中使用节点js域,node.js,node.js-domains,Node.js,Node.js Domains,我用expressjs编写了https服务器。我在我的服务器上添加了域。App.js文件: var d = require('domain').create(); d.on('error', function(error) { console.error("Domain caught error: "+ error.stack); }); d.run(function() { var express = require('express'); var appServ

我用expressjs编写了https服务器。我在我的服务器上添加了域。App.js文件:

var d = require('domain').create();

d.on('error', function(error) {
    console.error("Domain caught error: "+ error.stack);
});


d.run(function() {
    var express = require('express');
    var appServer = express();
    var https = require('https').createServer(options, appServer);

    https.listen(8000, function() {
        log.info('Server is listening on port ' + 8000);
    });

    appServer.use(appServer.router);
    var routes = require('./routes')(appServer); //my routes file
});
我在其他文件中有路由处理程序函数。如何在路由文件中使用在app.js文件中创建的域,而不从app.js文件中导出

更新:

routes.js文件:

var auth = require('./auth');

module.exports = function(app) {
    app.namespace('/login', function(){
    app.post('/user', auth.verifyUser);
    });
};
auth.js文件:

exports.verifyUser = function(req,res) {
    //here I want to see my domain
};

当您
需要
您的路线时,您可以通过:

var routes = require('./routes')(appServer, d);
var routes = require('./routes')(appServer, d);
然后在
routes/index.js
文件中:

module.exports = function(app, domain) {

    // ...

};
更新

要根据问题更新更新答案,这里有一个可能的解决方案,将
包含在每个路由定义中。有两种方法可以做到这一点(例如,您可以将每个路由设置为一个类,该类将被实例化并传递给
,然后为每个路由定义一个函数)。因为其目的是保持这些路由定义签名
函数(req,res)
,正如您在上面为
verifyUser
定义的那样,我们需要在调用函数之前将
传递到此路由。保持这一点非常简单,我们可以使用
setDomain
函数:

var auth = require('./auth');

module.exports = function(app, domain) {
    auth.setDomain(domain);
    app.namespace('/login', function() {
        app.post('/user', auth.verifyUser);
    });
};
var myDomain;

module.exports.setDomain = function(domain) {
    myDomain = domain;
};

module.exports.verifyUser = function(req, res) {
    res.send("myDomain: " + myDomain);
};
当您
需要
您的路线时,在主
index.js
中使用相同的代码:

var routes = require('./routes')(appServer, d);
var routes = require('./routes')(appServer, d);
routes.js
中,您可以通过
setDomain
功能将
传递给路由:

var auth = require('./auth');

module.exports = function(app, domain) {
    auth.setDomain(domain);
    app.namespace('/login', function() {
        app.post('/user', auth.verifyUser);
    });
};
var myDomain;

module.exports.setDomain = function(domain) {
    myDomain = domain;
};

module.exports.verifyUser = function(req, res) {
    res.send("myDomain: " + myDomain);
};
最后,在您的
auth.js
文件中,您可以获取域,并在文件范围内访问它,以便在
verifyUser
函数中使用它:

var auth = require('./auth');

module.exports = function(app, domain) {
    auth.setDomain(domain);
    app.namespace('/login', function() {
        app.post('/user', auth.verifyUser);
    });
};
var myDomain;

module.exports.setDomain = function(domain) {
    myDomain = domain;
};

module.exports.verifyUser = function(req, res) {
    res.send("myDomain: " + myDomain);
};

我不确定我是否真的喜欢这个解决方案,但再一次,它保持了
verifyUser
的签名不变。也许你会想到一个更好的,或者想重构你的代码,更好地利用你在代码中传递的这个域(可能在其他地方定义它,并在需要的地方从那里提取它)。

好的,但是在routes.js文件中我需要其他文件,我如何在那里看到域?你必须做同样的事情,调用函数时,将
域作为参数传递。实际上,您可以导出某些内容,也可以将其作为参数传递。您说过您不想导出,所以您需要以某种方式传递它。如果您提供路由的代码示例,我可以提供一个如何执行此操作的示例。除非你把它弄明白:)好的,我提供有问题的。