3

在 Express 中,有没有办法按照路由中定义的顺序获取从匹配路由传递的参数?

我希望能够将路由中的所有参数应用到另一个函数。问题是这些参数事先并不知道,所以我不能明确地按名称引用每个参数。

app.get(':first/:second/:third', function (req) {
    output.apply(this, req.mysteryOrderedArrayOfParams); // Does this exist?
});

function output() {
    for(var i = 0; i < arguments.length; i++) {
        console.log(arguments[i]);
    }
}

打电话GET: "/foo/bar/baz"

所需的输出(按此顺序):

foo
bar
baz
4

5 回答 5

1

req.route.keys是一个有序的参数数组,其内容如下{name:'first'}

所以,代码:

app.get(':first/:second/:third', function (req) {
    var orderedParams = [];
    for (var i = 0; i < req.route.keys; i++) {
        orderedParams.push(req.params[req.route.keys[i].name]);
    }
    output.apply(this, orderedParams);
});

function output() {
    for(var i = 0; i < arguments.length; i++) {
        console.log(arguments[i]);
    }
}
于 2013-06-24T21:44:21.380 回答
0

据我所知,通过 express route params 机制,这是一个非常简单的子系统。我想老好req.path.split('/')是你这里的朋友。

于 2013-06-24T20:54:23.197 回答
0

我相信你想要的是req.route.params对象。

Express 文档中查看更多信息。

于 2013-06-24T20:54:34.197 回答
0

如果您不想使用参数 ID 但想要他们的订单,那么请执行此操作

app.get('/:0/:1/:2', function (req,res) {
    console.log(req.params);
    console.log(req.params[0]);
    console.log(req.params[1]);
    console.log(req.params[2]);
    res.end();
});

//output

[ 'a', 'b', 'c' ]
a
b
c
GET /a/b/c 200 5ms
[ 'c', 'b', 'a' ]
c
b
a
GET /c/b/a 200 1ms

这将按照它们匹配的顺序

于 2013-06-25T04:17:11.650 回答
0

您的标题具有误导性。您正在寻找解析路径,但您的标题是我在寻找获取参数时发现的,所以我会发布答案。

我使用 lodash 将第一个参数 (req.params) 验证为 Mongo / ObjectId。在您的情况下,尽管您可以使用 lodash 键或值进行索引...

req.route.keys 对我和 req.params[0] 都不起作用

  if (_.size(req.params) === 1) {
    if (!mongoose.Types.ObjectId.isValid(_.values(req.params)[0])) {
      return res.status(500).send('Parameter passed is not a valid Mongo ObjectId');
    }
  }

于 2014-11-25T20:51:17.263 回答