Skip to content

Instantly share code, notes, and snippets.

@cfigueiroa
Forked from Briofita09/Routes_and_Controllers.md
Last active January 23, 2023 22:04
Show Gist options
  • Save cfigueiroa/f88900954070ea86eeaa486c0c815f51 to your computer and use it in GitHub Desktop.
Save cfigueiroa/f88900954070ea86eeaa486c0c815f51 to your computer and use it in GitHub Desktop.

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

image

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

image

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 createUserque 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.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment