https://github.com/WesleySoeiro/ProjetoBD
Segue o link do meu projeto estável.
Estou tentando criar um middleware de paginação para juntar as informações deste curso com o anterior de API rest.
fiz algo nesse sentido:
Middleware
const NaoEncontrado = require("../erro/NaoEncontrado.js");
async function paginar(req, res, next) {
try {
let { limite = 2, pagina = 1, ordenacao = "_id:-1" } = req.query;
let [campoOrdenacao, ordem] = ordenacao.split(":");
ordem = ordem === "1" ? "ASC" : "DESC";
if (isNaN(Number(limite)) || isNaN(Number(pagina))) {
res.status(400).json({ mensagem: "Os valores devem ser um numéricos" });
}
if (limite < 1 || pagina < 1) {
res.status(400).json({
mensagem: "Os valores de limite e pagina devem ser maiores que 0",
});
}
Object.entries(req.query).forEach(([chave, valor]) => {
if (!chave || valor.trim() === "") {
res.status(400).send("Parametros inválidos.");
}
});
const resultado = req.resultado;
const resultadoPaginado = await resultado.findAll({
limit: limite,
offset: (pagina - 1) * limite,
order: [[campoOrdenacao, ordem]],
});
if (resultadoPaginado.length > 0) {
return res.status(200).json(resultadoPaginado);
} else {
return next(new NaoEncontrado("Não há mais dados para listar."));
}
} catch (erro) {
console.log(erro);
next(erro);
}
}
module.exports = paginar;
Services
const { where } = require("sequelize");
const dataSource = require("../database/models");
class Services {
constructor(model) {
this.model = model;
}
async getAll(req, res, next) {
const resultado = dataSource[this.model].findAll();
req.resultado = resultado;
next();
}
....
Controller
const { Op } = require("sequelize");
const CamposVazios = require("../erro/CamposVazios.js");
const ErroValidacao = require("../erro/ErroValidacao.js");
const NaoEncontrado = require("../erro/NaoEncontrado.js");
const filtro = require("../helpers/filtro.js");
class Controller {
constructor(entidadeService) {
this.entidadeService = entidadeService;
}
async getAllRegisters(req, res, next) {
try {
const listarRegistros = await this.entidadeService.getAll(req, res, next);
} catch (erro) {
console.log(erro);
next(new NaoEncontrado());
}
}
...
Routes
const routes = require("express").Router();
const ProdutosController = require("../controllers/ProdutosController.js");
const paginar = require("../middlewares/paginar.js");
const produtosController = new ProdutosController();
routes
.get(
"/produtos",
async (req, res, next) =>
await produtosController.getAllRegisters(req, res, next),
paginar
)
Erro
Server is running on port 3000
TypeError: resultado.findAll is not a function
at paginar (C:\Users\wesle\OneDrive\Área de Trabalho\Projeto DB\Projeto\src\middlewares\paginar.js:27:47)
at Layer.handle [as handle_request] (C:\Users\wesle\OneDrive\Área de Trabalho\Projeto DB\Projeto\node_modules\express\lib\router\layer.js:95:5)
at next (C:\Users\wesle\OneDrive\Área de Trabalho\Projeto DB\Projeto\node_modules\express\lib\router\route.js:149:13)
at ProdutosServices.getAll (C:\Users\wesle\OneDrive\Área de Trabalho\Projeto DB\Projeto\src\services\Services.js:12:5)
at ProdutosController.getAllRegisters (C:\Users\wesle\OneDrive\Área de Trabalho\Projeto DB\Projeto\src\controllers\Controller.js:14:58)
at C:\Users\wesle\OneDrive\Área de Trabalho\Projeto DB\Projeto\src\routes\produtosRoutes.js:11:32
at Layer.handle [as handle_request] (C:\Users\wesle\OneDrive\Área de Trabalho\Projeto DB\Projeto\node_modules\express\lib\router\layer.js:95:5)
at next (C:\Users\wesle\OneDrive\Área de Trabalho\Projeto DB\Projeto\node_modules\express\lib\router\route.js:149:13)
at Route.dispatch (C:\Users\wesle\OneDrive\Área de Trabalho\Projeto DB\Projeto\node_modules\express\lib\router\route.js:119:3)
at Layer.handle [as handle_request] (C:\Users\wesle\OneDrive\Área de Trabalho\Projeto DB\Projeto\node_modules\express\lib\router\layer.js:95:5)
Eu percebi que na paginação resultados traz o objeto, como limitar o objeto que é recebido na area de paginação?