おおよそ次のような 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 へのより具体的なルートを持つuser
URL を取得するにはどうすればよいでしょうか。また、可能であれば、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);