小编典典

使用 Express.js 嵌套路由器休息

all

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

/user/
/user/user_id

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

CRUD 对每个 if 有意义。例如,/user POST 创建一个新用户,GET 获取所有用户。/user/ user_id GET 只获取那个用户。

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

现在为了使 Express 路由模块化,我制作了一些路由器实例。用户有一个路由器,物品有一个路由器。

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

URL toitemuser. 现在,我如何获取包含 userRouter 的 URL,/users但获取 itemRouter
的更具体的路由/user/*user_id*/items/?而且,如果可能的话,我希望 itemRouter 也可以访问 user_id。


阅读 87

收藏
2022-08-08

共1个答案

小编典典

您可以通过将路由器作为中间件附加到其他路由器上来嵌套路由器,无论是否带有params.

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

mergeParamsExpress4.5.0中引入(2014
年 7 月 5 日)

在此示例中,itemRouter附加到userRouter路线/:userId/items

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

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

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);
2022-08-08