Express.js / Node.js:重要的路由顺序,并把下一个()?

我有我的路线和path设置像这样:

var path1 = express.Router() , path2 = express.Router() // .. more modules, eg express-jwt .. module.exports = function(app, passport) { var path1Func = function(req, res) { return MODEL.findById(req.params.id, function(err, model) { if(!model) { res.statusCode = 404; return res.send({ status: '404 Not found' }); } if(!err) { return res.send({ status: 'OK', model:model }); } else { res.statusCode = 500; return res.send({ status: '500 Server error' }); } }); }; // .. other functions which essentially look like above path1Func .. path1.get('/subPath', path1Func ); path2.get('/otherSubPath', path2Func ); path2.post('/entirelyOtherSubPath', otherPath2Func ); app.use('/path1', path1); app.use('/path2', path2); app.use('/grid', expressJwt({secret: secret})); // Protect Paths } 

现在,取决于我的HTTP请求,POST,GET等的顺序,他们得到执行或返回一个404没有find,这意味着快递不解决请求的一些请求,取决于sorting的path1.getpath2.getpath2.post

express1Order

express2Order

以上图片描述了我看到的404,这取决于我的routes.js文件中的路由声明的顺序。 当我重新排列我的命令时,404已经不存在了,我得到了我想要的输出

这就是为什么我想用next()来帮助我 – 记住我正在使用大量的app.use来使事情复杂化。 到目前为止,我没有做到这一点。 我仍然不清楚next()究竟是什么,以及如何在上面的例子中使用它来使我的路由器在每一个路由器上工作。 我没有把我的其他路线放在这里,以节省空间,但我的API已经相当大,将增长更多。

无论订购我的POSTGET请求的顺序如何,我的应用程序都可以提供内容服务。

您显示的特定请求得到404的原因是您没有匹配的路由模式。

你正在请求/grid/dates/:val但是你只有一个/grid路由。 即使将/grid更改为/grid/dates/:val ,您仍然没有响应请求,因为所有expressJwt()都会validation请求,然后将执行传递给下一个处理程序。 所以考虑到这一点,你可能会尝试像这样:

 app.use('/grid/dates/:val', expressJwt({secret: secret}), function(req, res) { res.send(200, 'hello world!'); }); 

我相信你使用你的Routers错误的

 path1.get('/path1', path1Func ); path2.get('/path2', path2Func ); path2.post('/path2', otherPath2Func ); app.use('/path1', path1); app.use('/path2', path2); 

这将使用routes /path1/path1/path2/path2当你想要的是:

 path1.get('/', path1Func ); path2.get('/', path2Func ); path2.post('/', otherPath2Func ); app.use('/path1', path1); app.use('/path2', path2); 

虽然我不确定expressJwt是如何的。

我没有看到任何你需要使用next因为所有的路线path看起来都是独一无二的。 如果这不是您的问题,您可能需要提供更多信息。