1

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

这似乎没问题,虽然有点冗长,而且似乎有点机械。

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

有人对这个问题有很好的解决方案吗?

4

3 回答 3

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.paramsexpress.bodyParse()
  2. req.body
  3. req.query

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

于 2013-12-21T05:03:35.020 回答
0

像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 中的可选参数,以减少冗长,给定以下路线'/user/:id?'id参数是可选的。

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

于 2012-11-13T15:20:00.180 回答
0

如果它是我的项目,这就是我将如何去做的问题:

路由处理程序封装了参数如何来自客户端的知识,并且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.

于 2012-11-13T16:17:01.147 回答