处理Express中间件中的参数

时间:2012-11-13 15:00:29

标签: node.js express

我正在试图弄清楚如何构建我的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,
   ...)

这似乎没问题,虽然又有点冗长,看起来有点机械。

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

有人能解决这个问题吗?

3 个答案:

答案 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()的文档说它按以下顺序查找参数:

  1. req.params express.bodyParse()
  2. req.body
  3. req.query
  4. 我认为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参数是可选的。

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

答案 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可能是有意义的。