处理Express中间件中的参数

我想弄清楚如何构build我的Express代码,并且对如何处理参数感到困惑。 为了举例,让我们想象一下,我写了一些中间件,从数据库中加载一些东西:

var loadMW = function (request, response, next) { var thingID = request.params.id; // load thing from db and put in locals response.locals.thing = loadThing(id); //sync for simplicity next(); } 

在以下路线中使用时,这是很好的:

 app.get('/getThing/:id', loadMW, ...) 

让我们想象一下,我还想在请求体中有接受事件ID的路由(我知道在这种情况下,这看起来很有意思,但确实出现了)。

 app.post('/getThing', loadMW, ...) 

这不会起作用,因为loadMW希望在request.params中查找。 在这种情况下构build代码的最好方法是什么? 我可以考虑几个select。 首先是定义一个新的中间件:

 var loadMWBody = function (request, response, next) { var id = request.body.id; ... } 

这似乎是不必要的冗长,有点丑陋。

另一种方法是修改loadMW以始终查找本地ID,然后显式移动路由中的参数。

 var loadMW = function (request, response, next) { var thingID = response.locals.id; // load thing from db and put in locals response.locals.thing = loadThing(id); //sync for simplicity next(); } app.get('/getThing/:id', function (request, response, next) { response.locals.id = request.params.id; next(); }, loadMW, ...) app.post('/getThing', function (request, response, next) { response.locals.id = request.body.id; next(); }, loadMW, ...) 

这似乎没问题,虽然再次是有点冗长,似乎有点机械。

我觉得我可能会错过一些东西,而且有一个更优雅的方式来做到这一点。 我想过用某种函数来参数化中间件,这个函数指示如何获取参数,但是这并不是很简单(因为请求不在定义的范围之内)。

任何人都可以很好的解决这个问题?

还有另一种处理这个的方法。

 var loadMW = function (request, response, next) { var thingID = request.param('id'); // load thing from db and put in locals response.locals.thing = loadThing(id); //sync for simplicity next(); } 

request.param()的文档说它按以下顺序查找参数:

  1. req.params express.bodyParse()
  2. req.body
  3. req.query

我相信req.body部分取决于具有express.bodyParser()在某些时候使用。

像followig这样的东西是不会做的伎俩?

 var loadMW = function (request, response, next) { var thingID; if(request.param.id) { thingID = request.param.id; } else { thingID = request.body.id; } // load thing from db and put in locals response.locals.thing = loadThing(thingID); //sync for simplicity next(); } 

你也可以看一下express中的可选参数,为了减less冗长,给定以下路由'/user/:id?' id参数是可选的。

看看http://expressjs.com/api.html#app.use中间件。

如果这是我的项目,这是probs我怎么去做:

路由处理程序封装了params来自客户端的知识, loadMW只知道如何获取它(并在此示例中提供)。

 app.get('/getThing/:id', function(req, res) { loadMW(req.params, res); }); app.post('/getThing', function(req, res) { loadMW(req.body, res); }); function loadMW(opts, response) { var thingId = opts.id; ... } 

随着项目的增长,通过传递callback函数作为第二个参数 – 而不是response来进一步抽象loadMW可能是有意义的。