3
respostas

Erro .post requires a callback function

Boa tarde, esta aparecendo o seguinte erro:

Error: Route.post() requires a callback function but got a [object Undefined]
    at Route.(anonymous function) [as post] (C:\Users\rubens.almeida\Documents\Alura\Node JS\Node 2\casadocodigo\node_modules\express\lib\router\route.js:202:15)
    at module.exports (C:\Users\rubens.almeida\Documents\Alura\Node JS\Node 2\casadocodigo\src\app\rotas\livroRotas.js:15:10)
    at module.exports (C:\Users\rubens.almeida\Documents\Alura\Node JS\Node 2\casadocodigo\src\app\rotas\rotas.js:7:5)
    at Object.<anonymous> (C:\Users\rubens.almeida\Documents\Alura\Node JS\Node 2\casadocodigo\src\config\custom-express.js:25:1)
    at Module._compile (internal/modules/cjs/loader.js:776:30)
    at Object.Module._extensions..js (internal/modules/cjs/loader.js:787:10)
    at Module.load (internal/modules/cjs/loader.js:653:32)
    at tryModuleLoad (internal/modules/cjs/loader.js:593:12)
    at Function.Module._load (internal/modules/cjs/loader.js:585:3)
    at Module.require (internal/modules/cjs/loader.js:690:17)
[nodemon] app crashed - waiting for file changes before starting...

Pelo que entendi esta faltando uma cb na linha de código abaixo, mas no método inserirLivro() eu retorno uma função cb..

.post(Livro.validacoes(), livroControl.inserirLivro())

Segue os códigos para verificação:

const LivroControl = require("../controller/livroControl");
const livroControl = new LivroControl();

const Livro = require("../modelos/livro");


module.exports = (app) => {

    const rotasLivro = LivroControl.rotas();

    app.get(rotasLivro.lista,livroControl.lista());

    app.route(rotasLivro.cadastro)
        .get(livroControl.inicializaFormulario())
        .post(Livro.validacoes(), livroControl.inserirLivro())
        .put(livroControl.editarLivro());

    app.get(rotasLivro.edicao, livroControl.formularioEdicao());

    app.delete(rotasLivro.delecao, livroControl.excluirLivro());
}
3 respostas
const { check } = require('express-validator/check'); 

class Livro{
    static validacoes(){
        [
            check('titulo').isLength({ min: 5 }).withMessage("O título precisa ter no mínimo 5 caracteres"),
            check('preco').isCurrency().withMessage("O preço precisa ter um valor monetário") //se é monetário
        ]
    }
}

module.exports = Livro;
const LivroDao = require("../infra/livro-dao");
const db = require("../../config/database");

const templates = require("../views/templates");

//check = função pra dizer quais as validações que desejo validar, usado apenas na classe rotas.js
//validationResult vai pegar a requisição que ta chegando no servidor e verificar se houve algum erro
const { check, validationResult } = require('express-validator/check'); 

class LivroControl{

    static rotas(){
        return {
            lista: "/livros",
            cadastro: "/livros/form",
            edicao: '/livros/form/:id',
            delecao: '/livros/:id'
        }
    }

    lista(){
        return function(req, resp) {

            const livroDao = new LivroDao(db);
            livroDao.lista()
                    .then(livros => resp.marko(
                        templates.livros.lista,
                        {
                            livros: livros
                        }
                    ))
                    .catch(erro => console.log(erro));
        };
    }

    inserirLivro(){
        return function(req, resp) {
            console.log(req.body);
            const livroDao = new LivroDao(db);

            //retornar um objeto com os erros que tiveram
            const erros = validationResult(req);

            if (!erros.isEmpty()) {
                return resp.marko(
                    templates.livros.form,
                    {
                        //livro: {}, //passa ao template um livro vazio
                        livro: req.body, //o livro passado ao template recebe os dados passados pelo formulario previamente preenchidos 
                        errosValidacao: erros.array() //metodo do express-validator que devolve o array de erros
                    }
                );
            }

            livroDao.adiciona(req.body)
                    .then(resp.redirect(LivroControl.rotas().lista))
                    .catch(erro => console.log(erro));
        };
    }

    editarLivro(){
        return function(req, resp) {
            console.log(req.body);
            const livroDao = new LivroDao(db);

            livroDao.atualiza(req.body)
                    .then(resp.redirect(LivroControl.rotas().lista))
                    .catch(erro => console.log(erro));
        };
    }

    excluirLivro(){
        return function(req, resp) {
            const id = req.params.id; //pega a id da URL

            const livroDao = new LivroDao(db);
            livroDao.remove(id)
                    .then(() => resp.status(200).end())
                    .catch(erro => console.log(erro));
        };
    }

    inicializaFormulario(){
        return function(req, resp) {
            resp.marko(
                templates.livros.form, 
            { livro: {} });
        }
    }

    formularioEdicao(){
        return function(req, resp) {
            const id = req.params.id;
            const livroDao = new LivroDao(db);

            livroDao.buscaPorId(id)
                    .then(livro => 
                        resp.marko(
                            templates.livros.form, 
                            { livro: livro }
                        )
                    )
                    .catch(erro => console.log(erro));
        };
    }
}
module.exports = LivroControl;

Boa tarde, Rubens! Como vai?

Vc poderia compartilhar o seu projeto no github e mandar o link aqui? Assim eu poderei dar uma olhada melhor no que está acontecendo para tentar te ajudar!

Segue link do Github:

https://github.com/rubensback/AluraNode2