在中间件中使用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(); }