我是Express的新手。
我正在尝试根据DB中的值路由请求。为此,我正在调用服务功能。 路由工作成功但我丢失了请求对象。 我试图将req传递给服务但它没有用。
任何帮助显示如何做到这一点都很不错。
这是我的代码块。
var companyService = require("services/companyService");
router.use('/', function (req, res, next) {
companyService.isCompanyOnline(req.body.companyCode).then(function (company) {
if (company) {
router.use('/', require("api/controllers/online"));
}
else {
router.use('/', require("api/controllers/offline"));
}
});
next();
});
module.exports = router;
Services.companyService:
function isCompanyOnline(code) {
var deferred = Q.defer();
companies.findOne({ companyCode: code }, function (err, company) {
if (err) deferred.reject(err.name + ': ' + err.message);
//if (err) throw err;
if (company) {
// return company online parameter
deferred.resolve(company.isOnline);
} else {
// company not found
deferred.resolve();
}
});
return deferred.promise;
}
答案 0 :(得分:1)
您正在丢失请求对象,因为您没有将其传递到任何地方。
我相信你的主要问题是你有三个路由处理程序在同一条路径/
上注册。如果我没有弄错的话,他们将按顺序添加它们。但是,您的订单取决于您if
来电的router.use()
。所以这是不可预测的,并且可能无法按预期工作。 一旦注册,他们将保留在中间件堆栈,直到您重新启动应用程序。
我建议你重构一个地方的在线/离线逻辑,或者一次注册所有中间件,这样你知道它们被调用的顺序,并使用next()
相应
另一方面,如果您想将参数传递给require
d模块,请执行以下操作:
更改api/controllers/online
和另一个,接受一个参数,并返回你传递的处理函数。
// your code in api/controllers/online and offline
module.exports = function (req) {
// now you have req available in-scope here
function yourFunctionThatNeedsReq (req) {
// do stuff with req
}
return yourFunctionThatNeedsReq;
};
然后更新您的require
。请注意…(req)
。
router.use('/', require("api/controllers/online")(req) );
答案 1 :(得分:0)
我的解决方案:
首先,定义路线:
app.use('/api/online', require("api/controllers/online"));
app.use('/api/offline', require("api/controllers/offline"));
然后更改路由器中的URL:
if (req.body.companyInfo.isOnline) {
req.url = '/online' + req.url + '/' + req.body.companyInfo.companyPath;
next();
}
else {
req.url = '/offline' + req.url + '/' + req.body.companyInfo.companyPath;
next();
}