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

livros:1 POST http://localhost:3000/livros 500 (Internal Server Error

a pagina não sobe as mensagens de erro e vai direto pra página de erro 500 e dá esse erro no terminal:

{ titulo: '', preco: '', descricao: '' }
Error [ERR_STREAM_WRITE_AFTER_END]: write after end
    at write_ (_http_outgoing.js:629:17)
    at ServerResponse.write (_http_outgoing.js:621:15)
    at BufferedWriter.flush (C:\Dev\Alura\0-casadocodigo\casadocodigo\node_modules\marko\src\runtime\html\BufferedWriter.js:21:27)
    at BufferedWriter.end (C:\Dev\Alura\0-casadocodigo\casadocodigo\node_modules\marko\src\runtime\html\BufferedWriter.js:30:14)
    at AsyncStream._doFinish (C:\Dev\Alura\0-casadocodigo\casadocodigo\node_modules\marko\src\runtime\html\AsyncStream.js:221:26)
    at AsyncStream.end (C:\Dev\Alura\0-casadocodigo\casadocodigo\node_modules\marko\src\runtime\html\AsyncStream.js:263:22)
    at AsyncStream.error (C:\Dev\Alura\0-casadocodigo\casadocodigo\node_modules\marko\src\runtime\html\AsyncStream.js:446:18)
    at Timeout._onTimeout (C:\Dev\Alura\0-casadocodigo\casadocodigo\node_modules\marko\src\runtime\renderable.js:17:22)
    at listOnTimeout (internal/timers.js:549:17)
    at processTimers (internal/timers.js:492:7)
Error [ERR_STREAM_WRITE_AFTER_END]: write after end
    at write_ (_http_outgoing.js:629:17)
    at ServerResponse.write (_http_outgoing.js:621:15)
    at BufferedWriter.flush (C:\Dev\Alura\0-casadocodigo\casadocodigo\node_modules\marko\src\runtime\html\BufferedWriter.js:21:27)
    at BufferedWriter.end (C:\Dev\Alura\0-casadocodigo\casadocodigo\node_modules\marko\src\runtime\html\BufferedWriter.js:30:14)
    at AsyncStream._doFinish (C:\Dev\Alura\0-casadocodigo\casadocodigo\node_modules\marko\src\runtime\html\AsyncStream.js:221:26)
    at AsyncStream.end (C:\Dev\Alura\0-casadocodigo\casadocodigo\node_modules\marko\src\runtime\html\AsyncStream.js:263:22)
    at AsyncStream.error (C:\Dev\Alura\0-casadocodigo\casadocodigo\node_modules\marko\src\runtime\html\AsyncStream.js:446:18)
    at Timeout._onTimeout (C:\Dev\Alura\0-casadocodigo\casadocodigo\node_modules\marko\src\runtime\renderable.js:17:22)
    at listOnTimeout (internal/timers.js:549:17)
    at processTimers (internal/timers.js:492:7)
2 respostas

Tentei continuar o curso e ao fazer os controladores o ainda não funcionou só que agora da erro 404 -_- segue o link do meu código no github:

https://github.com/VictorTenedini/Alura.git

solução!

Oi, Victor, tudo bem?

Pelo que entendi você já está na parte de refatoração das rotas para se adaptar ao controladores, sugiro que você vá na pastaviews e crie o arquivo templates.js como na aula, e dentro de views, nas pastas, base e livros, criar o arquivo index.js referente ao caminho dos arquivos marko. Na pasta controladores, refatora o seu livro-contralador.js, para:

const { validationResult } = require('express-validator/check');

const LivroDao = require('../infra/livro-dao');
const db = require('../../config/database');

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

class LivroControlador {

    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));
        };
    }

    formularioCadastro() {
        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));
        };
    }

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

            const erros = validationResult(req);

            if (!erros.isEmpty()) {
                return resp.marko(
                    templates.livros.form,
                    { 
                        livro: {}, 
                        errosValidacao: erros.array()
                    }
                );
            }

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

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

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

    remove() {
        return function(req, resp) {
            const id = req.params.id;

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

module.exports = LivroControlador;

e base-controlador:

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

class BaseControlador {

    static rotas() {
        return {
            home: '/'
        };
    }

    home() {
        return function(req, resp) {
            resp.marko(
                templates.base.home
            );
        };
    }
}

module.exports = BaseControlador;

Agora, no seu rotas.js, você poderá chamar a rota correta:

module.exports = (app) => {
    const rotasBase = BaseControlador.rotas()
    const rotasLivro = LivroControlador.rotas()

    app.get('/', baseControlador.home());

    app.get('/livros', livroControlador.lista());

    app.get('/livros/form', livroControlador.formularioCadastro());

    app.get('/livros/form/:id', livroControlador.formularioEdicao());

    app.post(rotasLivro.cadastro, [
        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 válido!')
    ], 
    livroControlador.cadastra());

    app.put('/livros', livroControlador.edita());

    app.delete('/livros/:id', livroControlador.remove());
};

E assim as mensagens de erro são apresentadas em tela, e você não é redirecionado para a página 500.

Testa e me fala se deu certo!