1. ホーム
  2. javascript

[解決済み] Express.jsのネストしたルータでRestする

2022-04-23 20:09:13

質問内容

例えば、次のようなRESTエンドポイントを持ちたいとします。

/user/
/user/user_id 

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

意味があれば、それぞれでCRUDを行う。例えば、/userのPOSTは新しいユーザーを作成し、GETはすべてのユーザーを取得します。/user/ ユーザーID GETはその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 階層の子孫になります。 user . では、どのようにして /users はuserRouterに何であれ、より具体的なルートである /user/*user_id*/items/ をitemRouterに渡すのでしょうか?あと、できればuser_idもitemRouterにアクセスできるようにしてほしいです。

解決方法は?

として添付することで、ルータをネストすることができます。 ミドルウェア の有無にかかわらず、他のルータ上で 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);