Routes and Controllers
Router e Controllers fazem parte da arquitetura em camadas do back-end. Esse padrão de arquitetura possui algumas outras camadas, mas vamos falar como criar as duas primeiras camadas do back-end:
- Criando Routers
Quanto mais sua aplicação cresce, maior é a necessidade para uma organização. A primeira tarefa é definir as rotas que a sua aplicação vai ter e para isso você vai precisar de uma pasta chamada "routes" dentro da sua src
O exemplo acima possui duas pastas diferentes, uma para cada roteamento. Vamos olhar o roteamento dos usuários e ver como ele pode ser construído.
import { Router } from 'express';
import { validateSchemaMiddleware } from '…/…/middlewares/index.js';
import * as userController from '…/…/controllers/userController/index.js';
import { LoginSchema, SignUpSchema } from '…/…/schemas/userSchema/index.js';
const userRouter = Router();
userRouter.post(
'/sign-up',
validateSchemaMiddleware(SignUpSchema),
userController.createUser
);
userRouter.post(
'/login',
validateSchemaMiddleware(LoginSchema),
userController.loginUser
);
export { userRouter };
Na linha 1 importamos o Router diretamente do express. A Linha 2 é responsável por importar os middlewares, enquanto a linha 3 é responsável por importar os controllers e por fim a linha 5 importa os schemas de usuário.
Na linha 7 é criada uma variável que vai instânciar o Router do express para que o possamos utiliza-lo.
Assim, na linha 9 teremos nossa primeira rota. A rota "/sign-up"
é criada utilizando o método post do Router que foi instânciado acima dentro da variável userRouter
. Assim temos como primeiro parâmetro da função o exato endpoint, no caso, "/sign-up"
, o segundo parâmetro é uma middleware de validação (não se atentem a ela por enquanto) e o terceiro parâmetro é a função denominada createUser
que está na camada controller.
Por fim, exportamos userRouter
na linha 21.
- Alterando o app.js:
Antes de irmos a camada controller, vamos ver o que tem que ser modificado no arquivo onde antigamente ficavam as rotas e onde o express está instânciado:
import express from 'express';
import cors from 'cors';
import 'dotenv/config';
import { userRouter } from './routers/userRoutes/index.js';
import { transactionRouter } from './routers/transactionRoutes/index.js';
const app = express();
app.use(cors()).use(express.json()).use(userRouter).use(transactionRouter);
const PORT = process.env.PORT || 5000;
app.listen(PORT, () => {
console.log('servidor rodando na porta', PORT);
});
Na linha 5 importamos o userRouter
que criamos anteriormente e usamos o método use e passamos o userRouter
como parâmetro.
- Criando Controllers:
Seguindo o padrão dos routers, aqui temos um controller para cada model
Vamos falar especificamente do userController, já que estavamos falando dele no router.
export async function createUser(req, res) {
try {
const user = req.body;
const registeredUser = await db
.collection('users')
.find({ email: user.email })
.toArray();
if (registeredUser.length !== 0) {
return res.status(409).json({ message: 'usuário já cadastrado' });
}
const salt = genSaltSync(numberOfSalts);
const hashedPassword = bcrypt.hashSync(user.password, salt);
const newUser = {
user: user.name,
email: user.email,
password: hashedPassword,
};
const newRegisteredUser = await db.collection('users').insertOne(newUser);
if (newRegisteredUser) {
return res
.status(201)
.json({ message: 'usuário cadastrado com sucesso' });
}
} catch (err) {
console.log(err);
return res.status(500).json({ message: 'Erro interno do servidor' });
}
}
Na camada de controller, a função createUser
que chamamos no router é criada. Nela todas as regras de negócio, assim como o tratamento do body e das respostas é feito e enviado ao usuário.