处理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()
的文档说它按以下顺序查找参数:
-
req.params
express.bodyParse() -
req.body
-
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
参数是可选的。
如果这是我的项目,这是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
可能是有意义的。