Misalkan saya ingin memiliki titik akhir REST yang terlihat seperti ini:
/user/
/user/user_id
/user/user_id/items/
/user/user_id/items/item_id
CRUD pada masing-masing jika masuk akal. Sebagai contoh, / pengguna POST membuat pengguna baru, GET mengambil semua pengguna. / user / user_id GET mengambil hanya satu pengguna.
Item spesifik untuk pengguna, jadi saya menempatkannya di bawah user_id , yang merupakan pengguna tertentu.
Sekarang untuk membuat Express routing modular, saya membuat beberapa instance router. Ada router untuk pengguna, dan router untuk item.
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 ke item
adalah turunan dari hierarki URL user
. Sekarang bagaimana cara mendapatkan URL dengan /users
apa saja untuk userRouter tetapi rute yang lebih spesifik /user/*user_id*/items/
ke itemRouter? Dan juga, saya ingin user_id dapat diakses oleh itemRouter juga, jika memungkinkan.
sumber
Jawaban:
Anda dapat membuat sarang router dengan melampirkannya sebagai middleware pada router lain, dengan atau tanpa
params
.Anda harus meneruskan
{mergeParams: true}
ke router anak jika Anda ingin mengaksesparams
dari router induk.mergeParams
diperkenalkan di Express4.5.0
(5 Jul 2014)Dalam contoh ini
itemRouter
akan dilampirkanuserRouter
pada/:userId/items
ruteIni akan menghasilkan kemungkinan rute berikut:
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
sumber
rute bersarang yang dapat dikelola ...
Saya ingin contoh spesifik melakukan rute bersarang dengan cara yang sangat mudah diatur dalam ekspres 4 dan ini adalah hasil pencarian teratas untuk "rute bersarang dalam ekspres". Berikut adalah API yang akan memiliki banyak rute yang perlu dipecah misalnya.
./index.js:
./routes/api/index.js:
./routes/api/products.js:
Contoh bersarang dalam struktur folder
Saya memperhatikan beberapa komentar tentang "struktur folder bersarang". Ini tersirat dalam hal ini tetapi tidak jelas jadi saya menambahkan bagian di bawah ini. Berikut adalah contoh spesifik dari struktur folder bersarang untuk rute .
Ini lebih merupakan contoh umum tentang cara kerja simpul. Jika Anda menggunakan "index.js" di folder yang mirip dengan cara "index.html" bekerja di halaman web untuk direktori default, ini akan mudah untuk skala organisasi Anda berdasarkan rekursi tanpa mengubah titik masuk Anda ke kode. "index.js" adalah dokumen default yang diakses ketika menggunakan memerlukan dalam direktori.
isi dari index.js
isi /api/index.js
isi /api/admin/index.js
isi dari /api/admin/users/index.js
Ada beberapa masalah KERING di sini mungkin tapi itu cocok untuk merangkum keprihatinan.
FYI, baru-baru ini saya masuk ke dalam actionhero dan telah menemukan itu sebagai fitur lengkap dengan soket dan tugas, lebih seperti kerangka kerja all-in-one yang membalik paradigma REST di kepalanya. Anda mungkin harus memeriksanya agar tidak telanjang dengan ekspres.
sumber
Kunci untuk bagian kedua dari pertanyaan Anda adalah penggunaan opsi mergeParams
Dari
/user/jordan/item/cat
saya mendapat tanggapan:sumber
Menggunakan solusi @Jason Sebring, dan mengadaptasi untuk naskah.
server.ts
/api/routes/index.ts
/api/routes/home.ts
sumber
./api/routes
?./api/routes
memiliki dua fileindex.ts
danhome.ts
. Yang pertama digunakan olehserver.ts
. Semoga ini bisa membantu Anda.sumber
Anda hanya perlu satu router, dan gunakan seperti ini:
sumber
items
milikusers
hak, mengapa Anda harus memisahkan itu? Anda dapat mendefinisikannya dalam file yang berbeda masih menggunakan router yang sama jika Anda menginginkannya.