2015-09-05 52 views
0

我正在構建中間件處理程序,並且我發現當您將route字符串作爲next回調的參數返回時,它的值爲null嵌套路由器不會返回值爲'route'的下一個回調

這裏的例子:

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回調並提供nextValueanystring

爲什麼字符串route不能通過嵌套中間件傳播?

這看起來好像它實際上是有道理的快遞不返回route,因爲在該點路線完成的路線。

回答

0

首先關閉.use doesn't support next('route')。所以我用.all代替。即使這不返回字符串「路線」。所以我最後需要在路由器中注入一些中間件。如果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