在处理函数中使用节点js域

时间:2014-06-12 09:55:07

标签: node.js node.js-domains

我有用快递js编写的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
};

1 个答案:

答案 0 :(得分:0)

您可以在require路线时传递它:

var routes = require('./routes')(appServer, d);

然后在routes/index.js文件中:

module.exports = function(app, domain) {

    // ...

};

<强>更新

要根据问题更新更新答案,以下是在每个路径定义中包含domain的可能解决方案。有几种方法可以做到这一点(你可以使每个路由成为一个类,它将被实例化并传递domain,然后为每个路由定义一个函数,例如)。因为目的是保留上面为function(req, res)定义的路由定义签名verifyUser,我们需要在调用函数之前将domain传递给此路由。保持这个非常简单,我们可以使用setDomain函数来做到这一点:

当您index.js路线时,主require中的代码相同:

var routes = require('./routes')(appServer, d);

routes.js,您可以通过domain功能将setDomain传递给路线:

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

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

最后,在您的auth.js文件中,您可以获取该域,并且可以在该文件范围内访问该域,以便在verifyUser函数中使用它:

var myDomain;

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

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

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