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

Parametro do erro no middleware

Na parte do tratamento do erro, no "app/index.js" , o app.use passa o erro como primeiro parâmetro do callback "(erro, req, res, next)=>{...}", to com duvida se no primeiro parâmetro sempre é o colocado o que volta do next anterior, que nesse caso seria do put do "/routes/fornecedor/index.js"

/routes/fornecedor/index.js:

const express = require('express')
const router = express.Router()

const tabelaFornecedor = require('./tabelaFornecedores')
const Fornecedor = require('../../model/Fornecedor')

...

router.put('/:idFornecedor',async (req,res,next)=>{
    try{
        const id = req.params.idFornecedor
        const dados = req.body
        const concatFornecedor = Object.assign({},{id:id},dados)

        const fornecedor = new Fornecedor(concatFornecedor)
        await fornecedor.atualizar()
        res.status(204)
        res.end()
    }catch(e){
        next(e)
    }

})

...

module.exports = router

app/index.js:

const express = require('express')
const bodyParser = require('body-parser')
const config = require('config')

const routerFornecedor = require('./routes/fornecedores')
const NotFound = require('./error/NotFound')

const app = express()

app.use(bodyParser.json())
app.use('/api/fornecedores',routerFornecedor)
app.use((erro, req, res, proximo)=>{
    if(erro instanceof NotFound){
        res.status(404)
    }else{
        res.status(400)
    }
    res.send(
        JSON.stringify({
            mensagem: erro.message,
            id: erro.idError 
        })
    )
})

app.listen(3000, ()=>{
    console.log('Api rodando na porta 3000');
})
2 respostas
solução!

Oi Willian!

Espero que você esteja bem.

Sobre os middlewares/funções

A função next (ou proximo), se refere ao próximo middleware a ser executado no ciclo de requisição do Express.

Você faz uma requisição, o Express começa executando os middlewares definidos no app/index.js (raiz da API), em seguida ele leva a requisição para a sua rota, executando a função que você especificou - é a função que você passa em router.put(). Com isso você oide finalizar a requisição (pelo método res.send() ou res.end()) ou chamar o próximo middleware a ser executado com o proximo/next.

Todo middleware sempre vai receber: o objeto da requisição, da resposta e o próximo middleware a ser executado. Para passar informações entre middlewares, você pode alterar diretamente o objeto da requisição.

Sabe o pacote body-parser que usamos? Ele é um middleware que altera o objeto da requisição para você; primeiro ele lê os dados que vieram em JSON e os transforma em JS, colocando o valor dentro da propriedade req.body, para você usar como quiser.

Se a função next/proximo for executada com um erro como parâmetro, o Express irá encaminhar diretamente para o middleware que trata os erros (caso ele exista)

Sobre o tratamento de erro

O middleware que usamos para tratar o erro é um middleware como qualquer outro. A diferença é que o Express detecta quantos parâmetros a função do middleware está recebendo; se forem até três parâmetros (req, res, next), o Express sabe que é um middleware comum.

Se forem quatro parâmetros (erro, req, res, next), o middleware é identificado como quem vai tratar os erros da aplicação. Por isso que se você remover o 4º parâmetro (o next), o middleware não irá receber o erro para tratar.

Você pode ler mais sobre isso na documentação do Express (está em inglês)

Ficou bem claro, obrigado!