在中间件中使用Express Router.use
我是Express新手。
我正在尝试根据数据库中的值路由请求。 要做到这一点,我打电话给一个服务function。 路由工作正常,但我失去了请求对象。 我试图通过请求的服务,但它没有工作。
任何帮助显示如何做到这一点很好。
这是我的代码块。
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; }
您正在丢失请求对象,因为您没有将它传递到任何地方。
我相信你的主要问题是,你有三个路由处理程序注册在相同的path/
。 如果我没有弄错,他们会全部打电话给你,加上他们。 但是你的命令取决于你是否正在放置router.use()
调用。 所以这是不可预测的,而且可能不会像你期望的那样工作。 一旦他们注册,他们留在中间件堆栈,直到你重新启动应用程序。
我build议你重构一个地方的在线/离线逻辑,或者一次注册所有的中间件,这样你就知道它们被调用的顺序,并相应地使用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) );
我的解决scheme
首先,定义路线:
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(); }