嵌套路由器不会返回下一个回调,其值为' route'

时间:2015-09-05 20:41:01

标签: javascript node.js express middleware

我构建了一个中间件处理程序,我发现当你返回route字符串作为next回调的参数时,它的值是{{1} }。

以下是例子:

null

这意味着你不能像这样传递下一个处理程序:

var express = require('express')
var app = express()

app.use('/', function (req, res, next) {
  var router = express.Router()
  router.use(function (req, res, next) {
    return next('route')
  })
  return router(req, res, function (nextValue) {
    console.log('// value of next')
    console.log(nextValue)
    return next(nextValue)
  })
})

app.use('/', function (req, res, next) {
  return res.send('hi')
})

module.exports = app

我知道这看起来很多余,因为你可以这样做:

app.use('/', function (req, res, next) {
  var router = express.Router()
  router.use(function (req, res, next) {
    return next('route')
  })
  return router(req, res, next)
})

但是我正在构建一个需要以这种方式使用嵌套中间件的库。似乎我唯一的选择是使用不同的字符串,因为如果我这样做:

app.use('/', function (req, res, next) {
   return next('route')
})

router.use(function (req, res, next) { return next('anystring') }) 回调确实为next提供了nextValue

为什么字符串anystring不会通过嵌套中间件传播?

对于快递而言,这似乎是有意义的,因为在那一点上,路线已经完成。{/ p>

1 个答案:

答案 0 :(得分:0)

首先关闭.use doesn't support next('route')。所以我使用了.all代替。即便这样也不会返回字符串“route”。所以我需要在路由器中注入一些中间件。如果nextRoute的值未更新,则在中间件堆栈期间某个时间调用next('route'),我可以将其向上传播到父中间件。

我发现我必须在最后注入一块中间件

app.use(function (req, res, next) {
  var router = express.Router()
  var nextRoute = true
  router.all('/', [
    function (req, res, next) {
      return next('route')
    },
    function (req, res, next) {
      nextRoute = false
      return res.send('hi')
    },
  ])
  return router(req, res, function (nextValue) {
    if (nextRoute && !nextValue) return next('route')
    return next(nextValue)
  })
})

app.use('/', function (req, res, next) {
  return res.send('hi')
})

这允许我的middleware-nest模块工作:

var _ = require('lodash')
var express = require('express')

/** Allow for middleware to run from within middleware. */
function main (req, res, next, Router, middleware) {
  var args = _.values(arguments)
  middleware = _.flatten([_.slice(args, 4)])
  Router = (Router) ? Router : express.Router
  var router = Router()
  var nextRoute = true
  middleware.push(function (req, res, next) {
    nextRoute = false
    return next()
  })
  router.all('*', middleware)
  return router(req, res, function (nextValue) {
    if (nextRoute && !nextValue) return next('route')
    return next(nextValue)
  })
}

main.applyRouter = function (Router) {
  Router = (Router) ? Router : express.Router
  return function () {
    var args = _.values(arguments)
    args.splice(3, 0, Router)
    return main.apply(null, args)
  }
}

module.exports = main