2014-10-06 35 views
1

我有我的路线和路径设置是这样的:Express.js/Node.js:重要的路由顺序以及将next()放在哪里?

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未找到,表达确实意义不解决对某些请求的请求,具体取决于订购path1.get,path2.get,path2.post

express1Order

express2Order

上面这两幅画描绘了404,我看到,根据不同的路线声明我routes.js文件的顺序。当我重新排列我的订单时,404已经不存在了,我得到了我想要的输出

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

无论我的订单POSTGET的订单是什么订单,我的应用都可以通过什么方式让我的应用提供内容?

+0

对于我们在'...其他函数......“下的路由以及其他代码所针对的模块的情况,我们很难在没有上下文的情况下提供帮助。 – Jordonias 2014-10-06 15:16:09

+0

对不起,我抽象了SO的代码。让我纠正。 – nottinhill 2014-10-06 15:20:51

回答

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!'); 
}); 
+0

对不起有混淆代码,现在它被纠正(只有截图不同)。路线图很好,相信我。 – nottinhill 2014-10-06 15:37:49

+0

尝试了你的建议,它与expressJwt构建和功能后,它不工作在我身边.. prolly语法错误? – nottinhill 2014-10-06 16:17:32

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的地方。 如果这不是您的问题,您可能需要提供更多信息。

+0

对不起,在上面的例子中,现在示例代码应该是好的。我正在阅读http://expressjs.com/api.html#app.use,所以也许这对我有帮助。感谢您的建议,尽管它没有帮助。 – nottinhill 2014-10-06 16:16:57

+0

对不起,我仍然看不到你需要使用'next'的地方。你可能需要在你的路由中加入一些'console.log'来查看是否有路由。可能是一个完全不同的问题。 – Jordonias 2014-10-06 16:20:53

+0

好的,当我找到解决方案时,我会在这里发帖。这也有助于:http://webapplog.com/intro-to-express-js-parameters-error-handling-and-other-middleware/ – nottinhill 2014-10-06 16:30:01

相关问题