[解決済み] Express.jsのネストしたルータでRestする
質問内容
例えば、次のような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);
関連
-
Vueでルートネスティングを実装する例
-
Vueの一般的な組み込みディレクティブの説明
-
[解決済み] jQueryでチェックボックスに "checked "を設定する
-
[解決済み] JavaScriptで現在のURLを取得する?
-
[解決済み] JavaScriptで要素のクラスを変更するにはどうすればよいですか?
-
[解決済み] jQueryで要素にスクロールする
-
[解決済み] forEachループでasync/awaitを使用する
-
[解決済み] Node.js上のExpress.jsでGET(クエリ文字列)変数を取得する方法とは?
-
[解決済み] Express.js - app.listen vs server.listen
-
[解決済み] express.js で HTTPS を有効にする
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
jQueryのコピーオブジェクトの説明
-
Javascript Bootstrapのグリッドシステム、ナビゲーションバー、ローテーションの説明
-
JavaScriptの配列共通メソッド解説
-
VUEグローバルフィルターの概念と留意点、基本的な使い方
-
[解決済み】Uncaught SyntaxError: JSONの位置0に予期しないトークンuがあります。
-
[解決済み】Node.js Error: Cannot find module express
-
HTML5 LocalStorage ローカルストレージとセッションストレージの使用法
-
OSSアップロードエラーを解決する: net::ERR_SSL_PROTOCOL_ERROR
-
JavaScriptのgetElementById、getElementsByTagNam、getElementsByClassNameの違いと使い方
-
[解決済み】Expressに登録されている全ルートを取得する方法は?