【问题标题】:Use node js domains in handler function在处理函数中使用节点 js 域
【发布时间】:2019-05-25 01:28:47
【问题描述】:

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

【问题讨论】:

    标签: node.js node.js-domains


    【解决方案1】:

    当你require你的路线时你可以通过它:

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

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

    module.exports = function(app, domain) {
    
        // ...
    
    };
    

    更新

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

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

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

    在您的routes.js 中,您可以通过setDomain 函数将domain 传递给路由:

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

    【讨论】:

    • 好的,但是在 routes.js 文件中我还需要其他文件,如何在其中查看域?
    • 您必须做同样的事情,在调用函数时将domain 作为参数传递。实际上,您可以导出某些内容或将其作为参数传递。你说你不想导出,所以你需要以某种方式传递它。
    • 如果您提供路线的代码示例,我可以提供如何执行此操作的示例。除非你弄明白了:)
    • 好的,我提供有问题的。
    猜你喜欢
    • 2015-10-20
    • 2021-04-11
    • 2020-02-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多