Express.js ネストされたルーターを使用した REST 質問する

Express.js ネストされたルーターを使用した REST 質問する

おおよそ次のような REST エンドポイントが必要だとします。

/user/
/user/user_id 

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

それぞれの CRUD は意味があります。たとえば、/user POST は新しいユーザーを作成し、GET はすべてのユーザーを取得します。/user/ユーザーIDGET はその 1 人のユーザーだけを取得します。

アイテムはユーザー固有のものなので、ユーザー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 は、itemの URL 階層の子孫です。では、 userRouter への URL ではなく、itemRouter へのより具体的なルートを持つuserURL を取得するにはどうすればよいでしょうか。また、可能であれば、itemRouter から user_id にもアクセスできるようにしたいと思います。/users/user/*user_id*/items/

ベストアンサー1

ルーターをネストするには、次のように接続します。ミドルウェア他のルーターで、 の有無にかかわらずparams

親ルータから{mergeParams: true}アクセスする場合は、子ルータに渡す必要があります。params

mergeParams導入された急行4.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);

おすすめ記事