首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >带有Express.js嵌套路由器的Rest

带有Express.js嵌套路由器的Rest
EN

Stack Overflow用户
提问于 2014-08-12 17:30:44
回答 5查看 107K关注 0票数 166

假设我想拥有大致如下所示的REST端点:

代码语言:javascript
复制
/user/
/user/user_id 

/user/user_id/items/
/user/user_id/items/item_id

每个if上的CRUD都是有意义的。例如,/user POST创建了一个新用户,GET获取所有用户。/ user /user_id GET只获取一个用户。

项是特定于用户的,所以我将它们放在user_id下,这是一个特定的用户。

现在,为了使Express routing模块化,我做了几个路由器实例。有一个用于用户的路由器,以及一个用于项目的路由器。

代码语言:javascript
复制
var userRouter = require('express').Router();
userRouter.route('/')
  .get(function() {})
  .post(function() {})
userRouter.route('/:user_id')
  .get(function() {})

var itemRouter = require('express').Router();
itemRouter.route('/')
  .get(function() {})
  .post(function() {})
itemRouter.route('/:item_id')
  .get(function() {})

app.use('/users', userRouter);

// Now how to add the next router?
// app.use('/users/', itemRouter);

指向item的URL是user的URL层次结构的后代。现在,我如何使用/users获取URL,除了/user/*user_id*/items/到itemRouter的更具体的路由之外,还有什么userRouter?而且,如果可能的话,我希望itemRouter也能访问user_id。

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2014-08-14 17:59:50

无论是否使用params,您都可以通过将路由器作为middleware连接到另一台路由器上来嵌套路由器。

如果要从父路由器访问params,则必须将{mergeParams: true}传递给子路由器。

Express 4.5.0中引入了mergeParams (2014年7月5日)

在此示例中,itemRouter连接到/:userId/items路由上的userRouter

这将导致以下可能的路由:

GET /user -> hello user

GET /user/5 -> hello user 5

GET /user/5/items -> hello items from user 5

GET /user/5/items/6 -> hello item 6 from user 5

代码语言:javascript
复制
var express = require('express');
var app = express();

var userRouter = express.Router();
// you need to set mergeParams: true on the router,
// if you want to access params from the parent router
var itemRouter = express.Router({mergeParams: true});

// you can nest routers by attaching them as middleware:
userRouter.use('/:userId/items', itemRouter);

userRouter.route('/')
    .get(function (req, res) {
        res.status(200)
            .send('hello users');
    });

userRouter.route('/:userId')
    .get(function (req, res) {
        res.status(200)
            .send('hello user ' + req.params.userId);
    });

itemRouter.route('/')
    .get(function (req, res) {
        res.status(200)
            .send('hello items from user ' + req.params.userId);
    });

itemRouter.route('/:itemId')
    .get(function (req, res) {
        res.status(200)
            .send('hello item ' + req.params.itemId + ' from user ' + req.params.userId);
    });

app.use('/user', userRouter);

app.listen(3003);
票数 350
EN

Stack Overflow用户

发布于 2014-08-15 00:42:19

代码语言:javascript
复制
var userRouter = require('express').Router();
var itemRouter = require('express').Router({ mergeParams: true }); 

userRouter.route('/')
  .get(function(req, res) {})
  .post(function(req, res) {})
userRouter.route('/:user_id')
  .get(function() {})

itemRouter.route('/')
  .get(function(req, res) {})
  .post(function(req, res) {})
itemRouter.route('/:item_id')
  .get(function(req, res) {
    return res.send(req.params);
  });

app.use('/user/', userRouter);
app.use('/user/:user_id/item', itemRouter);

问题的第二部分的关键是使用mergeParams选项

代码语言:javascript
复制
var itemRouter = require('express').Router({ mergeParams: true }); 

代码语言:javascript
复制
{"user_id":"jordan","item_id":"cat"}
票数 10
EN

Stack Overflow用户

发布于 2020-07-27 21:13:43

代码语言:javascript
复制
const userRouter = require("express").Router({ mergeParams: true });
export default ()=>{
  userRouter
    .route("/")
    .get(getUser)
    .post(postUser);

  userRouter.route("/:user_id").get(function () {});
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25260818

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档