Solucionado (ver solução)
Solucionado
(ver solução)
2
respostas

Rota PUT não está funcionando (API Express)

Por algum motivo minha rota do protocolo PUT não está rodando e quando eu faço uma requisição no Postman, aparece a mensagem do schema (estou usando Joi para a validação do corpo de requisição) do protocolo POST, MESMO SE EU TROCAR O CONTEÚDO DA MENSAGEM! Screenshot demonstrando o problema descrito acima

Este é o meu arquivo server.ts com minhas rotas:

import express from "express";
import { tutorsData } from "./data/tutors/tutors.js";
import { validatePostTutor } from "./middlewares/validateTutor/validatePostTutor.js";
import { validatePutTutor } from "./middlewares/validateTutor/validatePutTutor.js";

export let tutors = [...tutorsData];

export const httpDogs = {
  notFound: `<img style='max-width: 500px; width: 300px; margin: 0 auto; display: inherit;' src='https://http.dog/static/codes/dogs/large/404.avif' alt='404 - Not Found :[' />`,
  badRequest: `<img style='max-width: 500px; width: 300px; margin: 0 auto; display: inherit;' src='https://http.dog/static/codes/dogs/large/400.avif' alt='400 - Bad Request :[' />`,
};

export const showData = (
  status: boolean,
  data: Object | Array<Object> | string | undefined
) => ({
  success: status,
  [typeof data === "object" ? "data" : "message"]: data,
});

const app = express();

app.use(express.json());

app.post("/tutor", validatePostTutor, (req, res) => {
  const tutor = req.body;

  if (!tutor)
    return res
      .status(400)
      .setHeader("Content-type", "text/html")
      .send(httpDogs.badRequest);

  tutors.unshift(tutor);
  res.status(200).json(showData(true, tutors));
});

app.put("/tutor/:id", validatePutTutor, (req, res) => {
  const { updatedTutor } = res.locals;

  res.status(200).json(showData(true, updatedTutor));
});

app.delete("/tutor/:id", (req, res) => {
  const { id } = req.params;

  const goneTutor = tutors.find((tutor) => tutor.id === Number(id));

  if (!goneTutor) {
    return res
      .status(404)
      .setHeader("Content-type", "text/html")
      .send(httpDogs.notFound);
  }

  const updatedTutors = tutors.filter(
    (tutor) => tutor.id !== Number(req.params.id)
  );

  tutors = updatedTutors;
  res.status(200).send(showData(true, tutors));
});

app.get("/tutors", (req, res) => res.status(200).json(showData(true, tutors)));

app.post("/pet/:tutorId", (req, res) => {
  const { tutorId } = req.params;
  const pet = req.body;

  const selectedTutor = tutors.find((tutor) => tutor.id === Number(tutorId));

  if (!selectedTutor)
    return res
      .status(404)
      .setHeader("Content-type", "text/html")
      .send(httpDogs.notFound);

  selectedTutor?.pets.unshift(pet);
  res.status(200).json(showData(true, selectedTutor?.pets));
});

app.get("*", (req, res) =>
  res
    .status(404)
    .setHeader("Content-type", "text/html")
    .send(httpDogs.notFound)
);

let PORT: number;

app.listen((PORT = 3000), () =>
  console.log(`Server running on localhost:${PORT}...`)
);

Este é o middleware validadePostTutor:

import { Request, Response, NextFunction } from "express";
import { httpDogs, tutors } from "../../server";
import { postTutorSchema } from "./schemas";

export const validatePostTutor = (
  req: Request,
  res: Response,
  next: NextFunction
) => {
  const tutor = req.body;
  const isEmpty = Object.entries(tutor).length === 0;
  const { id } = req.params;
  const { error } = postTutorSchema.validate(tutor);

  let selectedTutor = tutors.find((tutor) => tutor.id === Number(id));

  if (!isEmpty && error)
    return res
      .status(400)
      .json({ success: false, error: error.details[0].message });
  else if (isEmpty) return res.status(400).send(httpDogs.badRequest);

  res.locals.selectedTutor = selectedTutor;

  next();
};

Este problema está me impedindo de entregar o trabalho do meu estágio. Se alguém puder me ajudar eu agradeço muito. Me avisem se precisarem de mais informações.

2 respostas
solução!

Consegui resolver! O problema é que eu tinha esquecido de compilar o typescript huahuauh. Vou deixar a dica pra vocês que trabalham com nodemon e ts, pra não acontecer com vocês o que aconteceu comigo. Baixem a seguinte dependência: npm i ts-node. Com este pacote, o nodemon roda o TypeScript automaticamente e você não tem a necessidade de rodar tsc -w toda vez que iniciar o servidor.

NPM: npm i ts-node

Yarn: yarn add ts-node-dev --dev

Oi Kellyson, tudo bem?

Que bom que conseguiu resolver o problema e muito obrigada por compartilhar essa dica super valiosa com a gente! Com certeza vai ajudar outras pessoas.

Um abraço e bons estudos.