2015-09-05 2 views
0

Je suis en train de créer un gestionnaire pour le middleware et j'ai découvert que lorsque vous renvoyez la chaîne route comme argument pour le rappel next, sa valeur est null.Le routeur imbriqué ne renvoie pas le rappel suivant avec la valeur 'route'

Voici l'exemple:

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 

Ce qui signifie que vous ne pouvez pas passer le gestionnaire suivant dans la manière suivante:

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

Je sais que cela semble très redondant parce que vous pouvez simplement faire ceci: Cependant, je construis une bibliothèque qui doit utiliser un intergiciel imbriqué de cette manière. Il semble que ma seule option est d'utiliser une chaîne différente parce que si je le fais:

router.use(function (req, res, next) { 
    return next('anystring') 
    }) 

Le rappel next ne fournit nextValue avec anystring.

Pourquoi la chaîne route ne se propage pas via un middleware imbriqué?

Cela semble vraiment logique pour Express de ne pas retourner route parce qu'à ce stade, route cette route est terminée.

Répondre

0

Tout d'abord .use doesn't support next('route'). J'ai donc utilisé .all à la place. Même cela ne retourne pas la chaîne "route". J'ai donc dû injecter un middleware dans le routeur à la fin. Si la valeur nextRoute n'est pas mise à jour, alors next('route') a été appelée au cours de la pile de middleware et je peux la propager vers le middleware parent.

Je trouve que je dois injecter un morceau de middleware dans l'extrémité à

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') 
}) 

Cela permet mon module middleware-nest au travail:

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