我的路线和路径设置如下:
var path1 = express.Router()
, path2 = express.Router()
// .. more modules, e.g. 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找不到,这意味着express不会解析对某些请求的请求,这取决于path1.get
的顺序, path2.get
,path2.post
。
上面的图像描绘了我看到的404,具体取决于我的routes.js文件中路由声明的顺序。当我重新调整我的订单时,404已经消失了,我得到了我想要的输出
这就是为什么我想使用next()来帮助我 - 记住我使用大量的app.use
来解决问题。到目前为止,我无法自己做到这一点。我仍然不清楚next()究竟是什么以及如何在上面的示例中使用它来使我的路由器在每个路由中工作。我没有把我的其他路线放在这里以节省空间,但我的API已经相当大,而且还会增长更多。
无论我的POST
和GET
请求的订购顺序是什么,我的应用都会提供内容的方法是什么?
答案 0 :(得分:1)
您显示的特定请求获得404的原因是您没有匹配的路由模式。
您正在申请/grid/dates/:val
,但您只有/grid
路线。即使您将/grid
更改为/grid/dates/:val
,您仍然没有响应请求,因为所有expressJwt()
都会验证请求,然后将执行传递给下一个处理程序。因此,考虑到这一点,您可以尝试以下方式:
app.use('/grid/dates/:val',
expressJwt({secret: secret}),
function(req, res) {
res.send(200, 'hello world!');
});
答案 1 :(得分:1)
我相信您使用的是Routers
错误的
path1.get('/path1', path1Func );
path2.get('/path2', path2Func );
path2.post('/path2', otherPath2Func );
app.use('/path1', path1);
app.use('/path2', path2);
这将使用路线/path1/path1
和/path2/path2
当你想要的是:
path1.get('/', path1Func );
path2.get('/', path2Func );
path2.post('/', otherPath2Func );
app.use('/path1', path1);
app.use('/path2', path2);
虽然我不确定expressJwt
是怎样的。
我没有看到您需要使用next
的任何地方,因为所有路径路径看起来都是唯一的。
如果这不是您的问题,您可能需要提供更多信息。