Node.js 在处理程序函数中使用节点js域
我用expressjs编写了https服务器。我在我的服务器上添加了域。App.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
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文件中我需要其他文件,我如何在那里看到域?你必须做同样的事情,调用函数时,将域作为参数传递。实际上,您可以导出某些内容,也可以将其作为参数传递。您说过您不想导出,所以您需要以某种方式传递它。如果您提供路由的代码示例,我可以提供一个如何执行此操作的示例。除非你把它弄明白:)好的,我提供有问题的。