Suponha que eu queira ter pontos de extremidade REST parecidos com este:
/user/
/user/user_id
/user/user_id/items/
/user/user_id/items/item_id
CRUD em cada se faz sentido. Por exemplo, / user POST cria um novo usuário, GET busca todos os usuários. / user / user_id GET busca apenas esse usuário.
Os itens são específicos do usuário, então eu os coloquei em user_id , que é um usuário específico.
Agora, para modular o roteamento expresso, criei algumas instâncias de roteador. Há um roteador para o usuário e um roteador para o 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);
O URL para item
é descendente da hierarquia do URL do user
. Agora, como obtenho um URL /users
para o userRouter, mas a rota mais específica /user/*user_id*/items/
para o itemRouter? E também gostaria que o user_id também estivesse acessível ao itemRouter, se possível.
javascript
node.js
express
huggie
fonte
fonte
Respostas:
Você pode aninhar roteadores anexando-os como middleware em outro roteador, com ou sem
params
.Você deve passar
{mergeParams: true}
para o roteador filho se quiser acessar oparams
do roteador pai.mergeParams
foi introduzido no Express4.5.0
(5 de julho de 2014)Neste exemplo, o
itemRouter
é anexado aouserRouter
na/:userId/items
rotaIsso resultará nas seguintes rotas possíveis:
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
fonte
rotas aninhadas gerenciáveis ...
Eu queria um exemplo específico de fazer rotas aninhadas de uma maneira muito gerenciável no express 4 e este foi o resultado da pesquisa principal de "rotas aninhadas no express". Aqui está uma API que teria muitas rotas que precisariam ser divididas, por exemplo.
./index.js:
./routes/api/index.js:
./routes/api/products.js:
Exemplo de aninhamento na estrutura de pastas
Notei alguns comentários sobre a "estrutura de pastas aninhadas". Está implícito nisso, porém não é óbvio, então eu adicionei a seção abaixo. Aqui está um exemplo específico de uma estrutura de pastas aninhada para rotas .
Este é mais um exemplo geral de como o nó funciona. Se você usar "index.js" em pastas da mesma forma que "index.html" funciona em páginas da Web para um diretório padrão, será fácil dimensionar sua organização com base na recursão sem alterar seus pontos de entrada para código. "index.js" é o documento padrão acessado ao usar require em um diretório.
conteúdo de index.js
conteúdo de /api/index.js
conteúdo de /api/admin/index.js
conteúdo de /api/admin/users/index.js
Existem alguns problemas de DRY aqui, possivelmente, mas ele se presta bem ao encapsulamento de preocupações.
Para sua informação, recentemente entrei em ação e descobri que ela possui recursos completos com soquetes e tarefas, mais como uma verdadeira estrutura tudo em um, lançando o paradigma REST de cabeça para baixo. Você provavelmente deveria dar uma olhada em ficar nu com o expresso.
fonte
A chave para a segunda parte da sua pergunta é o uso da opção mergeParams
De
/user/jordan/item/cat
eu recebo uma resposta:fonte
Usando a solução @Jason Sebring e adaptando-se ao TypeScript.
server.ts
/api/routes/index.ts
/api/routes/home.ts
fonte
./api/routes
?./api/routes
tem dois arquivosindex.ts
ehome.ts
. O primeiro é usado porserver.ts
. Espero que ajude você.fonte
Você precisa de apenas um roteador e use-o assim:
fonte
items
pertence àusers
direita, por que você precisa separar isso? você pode defini-los em arquivos diferentes, ainda usando o mesmo roteador, se desejar.