我正在尝试使用默认情况下在快速初始化应用程序中使用的app.use(' /',路由器)模式将路由分成单个文件。例如:
var users = require('./routes/users');
// ...
app.use('/users', users);
我为博客添加了一个帖子路由器,工作正常:
var posts = require('./routes/posts');
// ...
app.use('/posts', posts);
但是,我现在在帖子上添加评论子路由。我需要在提供给app.use
的路径中使用命名参数,以便除了注释之外我还可以识别帖子:
var comments = require('./routes/comments');
// ...
app.use('/posts/:pid/comments', comments);
routes / comments.js文件如下所示:
var express = require('express');
var router = express.Router();
router.get('/', function(req, res) {
res.send('all comments + ', req.params.pid);
});
// ...
/posts/1/comments/34
等路径正确匹配并执行router / comments.js中的回调,但req.params.pid未定义。
是否可以在路径中使用带有命名参数的app.use(路径,路由器)模式?如果是这样,我该怎么做:pid命名参数?
答案 0 :(得分:1)
这个怎么样
<强> comments.js 强>
var express = require('express');
var router = express.Router();
router.get('/:pid/comments', function(req,res){
res.send('all comments for post id: ' + req.params.pid);
});
module.exports = router;
<强> posts.js 强>
var express = require('express');
var router = express.Router();
router.get('/', function(req,res){
res.send('show all posts');
});
router.get('/:pid', function(req,res){
res.send('show post with id: ' + req.params.pid);
});
module.exports = router;
终于app.js
var routes = require('./routes/index');
var users = require('./routes/users');
var comments = require('./routes/comments');
var posts = require('./routes/posts');
app.use('/posts', comments);
app.use('/posts', posts);
注意事项:
很抱歉。我发现这个不言自明。如果有什么令人困惑的,请在评论中提问。
答案 1 :(得分:0)
当您将路由器设置为comments
使用/posts/:pid/comments/
时,您实际上会丢弃:pid
参数,因为该参数在路由中不可用comments.js
中定义的函数。相反,您应该在posts.js
:
router.get("/:pid/comments", function(req, res) {
res.send("all comments " + req.params.pid);
});
当然,人们会期望需要更复杂的逻辑,这应该在一个单独的文件中定义,并在posts.js
中需要:
var comments = require("comments");
router.use("/:pid/comments", function(req, res) {
comments.renderGet(req.params.what, req, res);
});
在comments.js
中定义逻辑:
module.exports = {
renderGet: function(id, req, res) {
res.send("all comments " + id);
},
// ... other routes, logic, etc.
};