我正在试图弄清楚如何构建我的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,
...)
这似乎没问题,虽然又有点冗长,看起来有点机械。
我觉得我可能会遗漏一些东西,并且有一种更优雅的方式来做到这一点。我想过用某种函数来参数化中间件,这些函数指示如何获取参数,但这并不是很简单(因为请求不在定义的范围内)。
有人能解决这个问题吗?
答案 0 :(得分:4)
还有另一种处理方式。
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()
。
答案 1 :(得分:0)
像追随者这样的东西不会成功吗?
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();
}
您还可以查看快递中的可选参数,以减少详细程度,给定以下路线'/user/:id?'
id
参数是可选的。
答案 2 :(得分:0)
如果是我的项目,这就是我如何去做的事情:
路由处理程序封装了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;
...
}
随着项目的发展,通过传递loadMW
函数作为第二个参数 - 而不是callback
来进一步抽象response
可能是有意义的。