我构建了一个中间件处理程序,我发现当你返回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>
答案 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