Implemente endpoints de roteamento seguindo a convenção de estrutura de pastas, conforme praticado no Next.js
Pacote OpenSource, desenvolvido por RoxterXteezer.
- [x] Estável em produção
- [x] Ultima versão 2024-04-02
- [x] Versão atualizada v0.1.8
Gerencie as principais envs em ambiente de teste.
# .env.test
$ ROXTER_MODE = "dev"|"prod" #default -> dev. Obrigatório mudar p/ "prod" em ambiente de produção.
$ ROXTER_PORT = 3333 #default -> porta de entrada (não obrigatório)
$ ROXTER_HOSTNAME = "localhost" #default (não obrigatório)
$ ROXTER_FILE_PATH = "./" #default -> __root pasta onde o arquivo app.routes.js será criado (não obrigatório)
$ ROXTER_FILE_ROUTES = "app.routes.js" #default -> nome_do_arquivo onde as rotas serão salvas (não obrigatório)
$ ROXTER_TIMEOUT = 10000 #default -> tempo limite de espera para resposta do serviço (não obrigatório)
$ ROXTER_CPUS = 0 #default -> detalhes no texto abaixo...
Através da env ROXTER_CPUS, cria-se um cluster capaz de distribui o número de requisições, atuando como um balanceador de carga (load balancer) para os workers. O processo principal envia cada request para um único worker, alternando entre eles para tentar manter uma carga constante para cada um (estratégia round-robin). O cluster é capaz de entregar mais que o dobro do número de requests, e isto é um ganho excepcional. Vale lembrar que o poder de processamento da máquina não está sendo modificado, mas simplesmente se está evitando uma grande quantidade de tempo ocioso de CPU. Desta forma, a aplicação está fazendo um melhor aproveitamento dos recursos disponíveis. Você ainda poderá multiplicar o número de processamento através da variável. Exemplo:
1. Inicie um novo projeto:
# Crie um novo package.json
$ npm init -y
2. Instale o pacote RoxterJS
# npm ou yarn
$ npm i roxterjs
3. Crie na raiz do seu projeto o arquivo app.js:
# app.js
3. Organize uma estrutura de pastas e defina qual será a pasta principal onde as rotas serão aninhadas. Neste exemplo, todas as rotas serão criadas a partir da pasta /routes:
- root_projeto
- app.js
- package.json
- README.md
- src/
- routes/
- controller/
- services/
4. No arquivo principal do projeto (app.js), importaremos a biblioteca e, informaremos o caminho exato da pasta raiz das rotas. Exemplo:
# app.js
import Roxter from "roxterjs";
const roxter = await Roxter('./src/routes'); # <-caminho-> './src/routes'
# A função abaixo irá construir as rotas e iniciar o servidor
roxter.Start();
A partir da pasta /routes, todas as subpastas são rotas aninhadas. Exemplo:
- root_projeto
- app.js
- package.json
- README.md
- src/
-
routes/
- api/
- view/
- api/
-
routes/
No exemplo acima, o endpoint ficará:
# http://localhost:3333/api/view
Para definir o method (get | post | put | delete) para o endpoint, basta adicionar o verbo(method) como nome_do_arquivo.js. Exemplo:
- root_projeto
- app.js
- package.json
- README.md
- src/
-
routes/
- api/
- view/
- get.js
- view/
- api/
-
routes/
No exemplo acima, o endpoint se mantém:
# http://localhost:3333/api/view
Agora, é só colocar a lógica da função neste arquivo:
# __root/src/routes/api/view/get.js
export default async function App({ res }){
return res.end(JSON.stringfy({
name: "RoxterJs",
partner: "Roxter.Xteezer",
address: "São Paulo - SP"
}))
}
Agora teste sua primeira rota:
# Teste cURL:
$ curl -X GET http://localhost:3333/api/view
Para criar "slugs" na url, basta adicionar colchetes entre o nome da subpasta. Exemplo: __root/src/routes/api/view/[id]/get.js`.
# __root/src/routes/api/view/[id]/get.js
export default async function App({ res, keys }){
const { id } = await keys;
return res.end(`Sua chave é ${id}`);
}
O endpoint da requisição será `http://localhost:3333/api/view/valor_do_id`
# Teste cURL:
$ curl -X GET http://localhost:3333/api/view/1234
Para receber as "querys" pela url, adicione params na chave principal da função:
# __root/src/routes/api/view/[id]/get.js
export default async function App({ res, keys, params }){
const { color } = await params;
const { id } = await keys;
return res.end(`Sua chave é ${id}, sua cor é ${color}`);
}
O endpoint da requisição será `http://localhost:3333/api/view/valor_do_id?color=sua_cor_preferida`
# Teste cURL:
$ curl -X GET http://localhost:3333/api/view/1234?color=azul
Para receber dados da requisição, o method obrigatório é post.js. Por isso criaremos uma rota diferente e um novo arquivo.
- root_projeto
- app.js
- package.json
- README.md
- src/
-
routes/
- api/
- view/
- ...
- view/
- data/
- dong/
- post.js
- dong/
- api/
-
routes/
No exemplo acima, o endpoint ficará:
# http://localhost:3333/data/dong
Para receber o "body", adicione body na chave principal da função:
# __root/src/routes/data/dong/post.js
export default async function App({ res, body }){
const { id } = await body;
return res.end(`Sua chave é ${id}`);
}
O endpoint da requisição será `http://localhost:3333/app/dong/`
# Teste cURL:
$ curl -X POST http://localhost:3333/data/dong -d '{"id":"191919"}'
Você pode adicionar o header em cada endpoint ou padronizar para todos, a partir do arquivo app.js. Veja como:
# app.js
import Roxter from "roxterjs";
const roxter = await Roxter('./src/routes');
# Adicione como parâmetro Start({ params })
roxter.Start({
setHeaders:[
{ name: "Access-Control-Allow-Origin", value: "*" },
{ name: "Access-Control-Allow-Methods", value: "GET, OPTIONS, POST, PUT" },
{ name: "Access-Control-Allow-Headers", value: "Access-Control-Allow-Headers, Origin, X-Requested-With, Content-Type, Accept, Authorization" }
]
});
# Clone este repositório
$ git clone https://github.com/packrd/roxterjs.git
As seguintes ferramentas foram usadas na construção do projeto:
- [x] NodeJs
- [x] Javascript
- [ ] TypeScript
🥇 @rodrigo.buttura