1
resposta

query sempre retornando status 400

A query está sempre retornando status 400, quando eu passo por exemplo: http://localhost:3000/livros/busca?titulo=thum vou postar aqui os arquivos:

livrosController.js

import Handler404 from "../erros/Handler404.js"
import {livros} from "../models/index.js"
import {autores} from "../models/index.js"


class LivroController {

  static listarLivros = async(req, res,next) => {
    try {

      const livrosResults = await livros.find().populate("autor")
      res.status(200).json(livrosResults)

    } catch (error) {
      next(error)
    }
  }

  static listarLivroPorId = async(req, res,next) => {
    try {
      const result = await livros.findById(req.params.id)

      if(result !== null){
        res.status(200).json(result)
      }else{
        next(new Handler404("livro não encontrado"))
      }
    } catch (error) {
      next(error)

    }
  }

  static cadastrarLivro = async(req, res, next) => {


    try {
      const autor = await autores.findById(req.body.autor)
      if(!autor){
        next(new Handler404("Autor não encontrado"))
      }else{
        const novoLivro = new livros(req.body) 

        await novoLivro.save()
        res.status(200).json(novoLivro)
      }



    }catch (error) {
      next(error)
    }
  }

  static atualizarLivro = async(req, res,next) => {
    const {titulo, autor, editora, numeroPaginas} = req.body
    try {
      const novoLivro = {titulo, autor, editora, numeroPaginas}
      const livro = await livros.findByIdAndUpdate(req.params.id, novoLivro)
      if(!livro){
        next(new Handler404("livro não encontrado"))
      }else{
        res.status(200).json(novoLivro)
      }


    } catch (error) {
      next(error)
    }
  }

  static excluirLivro = async(req, res,next) => {
    try {
      const livroDeletado = await livros.findByIdAndDelete(req.params.id)
      if(!livroDeletado){
        res.status(200).json(livroDeletado)
      }else{
        res.status(201).send(`o livro ${livroDeletado.titulo} foi deletado`)
      }


    } catch (error) {
      next(error)
    }
  }
  static getLivrosPorFiltro = async(req,res)=>{
    try {
      const { titulo} = req.query
      console.log("titulo:", titulo)
      await livros.find({titulo: titulo})
      res.status(200).send(titulo)
    } catch (error) {
      res.status(500).send("a requisição passou aqui")
    }
  }
}

livrosRoutes.js

import express from "express"
import LivroController from "../controllers/livrosController.js"

const router = express.Router()

router
  .get("/livros", LivroController.listarLivros)
  .get("/livros/:id", LivroController.listarLivroPorId)
  .get("/livros/busca:?", LivroController.getLivrosPorFiltro)
  .post("/livros", LivroController.cadastrarLivro)
  .put("/livros/:id", LivroController.atualizarLivro)
  .delete("/livros/:id", LivroController.excluirLivro)

export default router   

Livro.js

import mongoose from "mongoose"

const livroSchema = new mongoose.Schema(
  {
    id: {type: String},
    titulo: {type: String},
    autor: {type: mongoose.Schema.Types.ObjectId, ref: "autores", required: [true, "o id do autor é obrigatório"]},
    editora: {type: String, required: [true, "o nome da editora é obrigatório"]},
    numeroPaginas: {
      type: Number,
      validate: {
        validator: (num)=>{
          return num > 10 && num < 5000
        }
      },
      message: "O número de páginas deve estar entre 10 e 5000. Valor recebido {VALUE}"
    }
  }
)

const livros= mongoose.model("livros", livroSchema)

export default livros
1 resposta

Olá Luiz! Tudo bem?

Pelo que percebi, o problema está na rota que você está utilizando para fazer a busca. No seu arquivo livrosRoutes.js, a rota está assim: .get("/livros/busca:?", LivroController.getLivrosPorFiltro). Não é necessário utilizar o :? que está no final da string, então você pode alterar o código para ficar apenas assim: .get("/livros/busca", LivroController.getLivrosPorFiltro).

Com isso, deve funcionar.

Espero ter ajudado! Abraços e bons estudos :)