app.use(路径,路由器)匹配,但如何在路径中提取命名参数

时间:2014-07-23 00:58:35

标签: javascript node.js express

我正在尝试使用默认情况下在快速初始化应用程序中使用的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命名参数?

2 个答案:

答案 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);

注意事项:

  • 在comments.js中,我使用'/:pid / comments'作为匹配路径,以便在那里提供帖子ID。
  • 在app.js中,我首先将评论路线传递给应用,然后发布之后的路线,以便首先匹配评论路线
  • 评论和帖子都有根路径'/帖子'

很抱歉。我发现这个不言自明。如果有什么令人困惑的,请在评论中提问。

答案 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.
};