Express.js / Node.js:重要的路由顺序和下一个放置的位置()?

时间:2014-10-06 15:11:53

标签: node.js express

我的路线和路径设置如下:

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.getpath2.post

express1Order

express2Order

上面的图像描绘了我看到的404,具体取决于我的routes.js文件中路由声明的顺序。当我重新调整我的订单时,404已经消失了,我得到了我想要的输出

这就是为什么我想使用next()来帮助我 - 记住我使用大量的app.use来解决问题。到目前为止,我无法自己做到这一点。我仍然不清楚next()究竟是什么以及如何在上面的示例中使用它来使我的路由器在每个路由中工作。我没有把我的其他路线放在这里以节省空间,但我的API已经相当大,而且还会增长更多。

无论我的POSTGET请求的订购顺序是什么,我的应用都会提供内容的方法是什么?

2 个答案:

答案 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的任何地方,因为所有路径路径看起来都是唯一的。 如果这不是您的问题,您可能需要提供更多信息。