0

我有用 express 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
};
4

1 回答 1

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. 也许您会想到一个更好的,或者想要重构您的代码以更好地利用您在代码中传递的这个域(也许在其他地方定义它并从那里拉取它需要的地方)。

于 2014-06-12T17:02:46.920 回答