Javascript 使用(路径、路由器)匹配,但如何提取路径中的命名参数

Javascript 使用(路径、路由器)匹配,但如何提取路径中的命名参数,javascript,node.js,express,Javascript,Node.js,Express,我正在尝试使用应用程序将路由分离为单个文件。在express初始化的应用程序中,使用默认情况下使用的('/',router)模式。例如: var users = require('./routes/users'); // ... app.use('/users', users); 我为博客添加了一个帖子路由器,效果很好: var posts = require('./routes/posts'); // ... app.use('/posts', posts); 然而,我现在在帖子上添加了注

我正在尝试使用应用程序将路由分离为单个文件。在express初始化的应用程序中,使用默认情况下使用的('/',router)模式。例如:

var users = require('./routes/users');
// ...
app.use('/users', users);
我为博客添加了一个帖子路由器,效果很好:

var posts = require('./routes/posts');
// ...
app.use('/posts', posts);
然而,我现在在帖子上添加了注释子例程。我需要在提供给
app的路径中使用一个命名参数。使用
可以识别帖子以及评论:

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命名参数?

当您将路由器设置为对
/posts/:pid/comments/
使用
注释时,您实际上是在丢弃
:pid
参数,因为该参数在
comments.js
中定义的路由函数中不可用。相反,您应该在
posts.js中定义此路由:

router.get("/:pid/comments", function(req, res) {
    res.send("all comments " + req.params.pid);
});
var comments = require("comments");

router.use("/:pid/comments", function(req, res) {
    comments.renderGet(req.params.what, req, res);
});
module.exports = {
    renderGet: function(id, req, res) {
                   res.send("all comments " + id);
               },

     // ... other routes, logic, etc.
};
当然,人们会期望需要更复杂的逻辑,这些逻辑应该在一个单独的文件中定义,并且在
posts.js
中需要:

router.get("/:pid/comments", function(req, res) {
    res.send("all comments " + req.params.pid);
});
var comments = require("comments");

router.use("/:pid/comments", function(req, res) {
    comments.renderGet(req.params.what, req, res);
});
module.exports = {
    renderGet: function(id, req, res) {
                   res.send("all comments " + id);
               },

     // ... other routes, logic, etc.
};
comments.js
中定义您的逻辑:

router.get("/:pid/comments", function(req, res) {
    res.send("all comments " + req.params.pid);
});
var comments = require("comments");

router.use("/:pid/comments", function(req, res) {
    comments.renderGet(req.params.what, req, res);
});
module.exports = {
    renderGet: function(id, req, res) {
                   res.send("all comments " + id);
               },

     // ... other routes, logic, etc.
};
这个怎么样

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;
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;
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);
posts.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;
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;
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);
最终app.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;
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;
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);
注意事项:

  • 在comments.js中,我使用'/:pid/comments'作为匹配路径,因此post id在那里可用
  • 在app.js中,我首先将评论路由传递给app,然后发布路由,以便首先匹配评论路由
  • 评论和帖子都有根路径“/posts”

抱歉这么简单。我觉得这是不言自明的。如果有任何令人困惑的地方,请在评论中询问

这就是我现在所依赖的。这给我的印象是一个bug,或者至少是一个合理的功能请求,此外还阻止了routes/posts.js和routes/comments.js中的并行代码构造。我会再等一段时间,看看是否还有其他人有其他建议,如果没有,就把这个答案标记为正确。谢谢,我同意。这似乎是一个更优雅的解决方案。显然,这是来了!express4.5.0或更高版本中提供的功能如下:
var router=Express.router({mergeParams:true})