是否有可能在节点快递中跳过路由中间件?

快递中采取以下POSTfunction。 (我正在使用Express 3.5.1)

app.post('/example', someFunctionOne, someFunctionTwo, function(req, res){ if(!req.someVar){ return res.send(400, { message: 'error'}); } else{ return res.json(200, { message: 'ok'}); } }); 

如果我从某个FunctionOne中得到一些结果,这意味着某些FunctionTwo是多余的,有没有办法跳过一些FunctionTwo并转到最后一个未命名的函数来发送响应?

所以我想同样的方式有“next()”函数,“last()”函数在哪里? 如果这不可能,为什么不呢? 这对我来说似乎是一个疏忽,但是有一个很好的理由吗?

你可以做next('route') ,这将完全去下一个路线。 这不是你在这种情况下所需要的,但是如果你把你的代码分成两个单独的路由,它就会工作。

但是,我认为这种条件逻辑通常有两种方法:

  • someFunctionOnereq实例上得到一些特殊的结果,并且做someFunctionTwo足够聪明的检查,当findcall next()并绕过它自己。 这是最习惯的expression方式,大多数中间件在同一个请求中被多次调用时会被检测到,并且避免重做他们的工作。
  • 在一些someFunctionOne ,当特殊情况发生时,直接调用lastFunction 。 记住中间件抽象不是圣杯。 如果你的中间件如此紧密耦合,也许他们应该是一个中间件和一些辅助函数。 还有很多其他的方法来组织可能更自然的代码。

可能是最好的方式来做一些帮手或把你自己的中间件链而不是你的function。

所以你的代码看起来像这样:

 app.post('/example', oneOf(key, someFunctionOne, someFunctionTwo), function(req, res){ if(!req[key]){ return res.send(400, { message: 'error'}); } else{ return res.json(200, { message: 'ok'}); } }); 

帮手应该是这样的:

 function oneOf (key) { var fns = Array.prototype.slice.call(arguments, 1); var l = fns.length; return function (req, res, next) { var i = 0; function _next () { if (req[key] || i === l) return next(); fns[i](req, res, _next); i += 1; } _next(); } } 

如果你决定在这里做的代码将如下所示:

 app.post('/example', functionOneOrTwo, function(req, res){ if(!req.someVar){ return res.send(400, { message: 'error'}); } else{ return res.json(200, { message: 'ok'}); } }); function functionOneOrTwo(req, res, next) { someFunctionOne(req, res, function () { if (req.someVar) return next(); someFunctionTwo(req, res, next); }); } 

简单但未经testing;-)

其实我也面对同样的问题。 我只是发现express-unless模块完全是这样的: https : //github.com/jfromaniello/express-unless