我试图弄清楚如何构建我的 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。在这种情况下,构建代码的最佳方法是什么?我可以想到几个替代方案。首先是定义一个新的中间件:
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,
...)
这似乎没问题,虽然有点冗长,而且似乎有点机械。
我觉得我可能会遗漏一些东西,并且有一种更优雅的方法可以做到这一点。我考虑过使用某种指示如何获取参数的函数来参数化中间件,但这并不是很简单(因为请求不在定义点的范围内)。
有人对这个问题有很好的解决方案吗?