Express v4:如何在param中间件之前运行特定于路由的中间件?

时间:2016-02-04 20:32:10

标签: javascript node.js express

长话短说,我有一个相当奇怪的路由场景,我需要在调用参数中间件之前调用中间件:

router.param('foo', function (req, res, next, param) {
  // Get the param value
  ...
  next()
})

router.route('/:foo')
  .all(function (req, res, next) {
    // I want to run this before the router.param middleware
    // but I don't want to run this on /:foo/bar
    ...
    next()
  })
  .get(function (req, res, next) {
    // Run this after the router.param middleware
    ...
    res.send('foo')
  })

router.route('/:foo/bar')
  .get(function (req, res, next) {
    // Run this after the router.param middleware
    ...
    res.send('bar')
  })

现在,我理解为什么param中间件通常先运行,但有没有办法解决这个问题?

我尝试使用router.use 而没有这样的路径:

router.use(function (req, res, next) {
  // I want to run this before the router.param middleware
  // but I don't want to run this on /:foo/bar
  ...
  next()
})

...并在router.param中间件之前调用它,但之后也会为/:foo/bar调用它。

最后,如果我使用router.use 这样的路径:

router.use('/:foo', function (req, res, next) {
  // I want to run this before the router.param middleware
  // but I don't want to run this on /:foo/bar
  ...
  next()
})

...首先调用router.param中间件(正如您所期望的那样)。

有办法做到这一点吗?

1 个答案:

答案 0 :(得分:1)

我绝不是正则表达式的专家,但您可以使用正则表达式来匹配路线。这适用于您的特定用例,尽管可能有更好的方法。

router.use(/^\/[^\/]*$/, function(req, res, next) {

});