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

Usando Middleware

Opa,

Como faço para inserir uma função dentro do Middleware que se funcionar prossegue com a execução do Expresse se não ele para a execução e solta erro.

5 respostas

Olá André,

Ficou um pouco confuso o que você quis dizer, da maneira como você descreveu, me parece que você está querendo de fato criar um middleware, correto?

Por exemplo, vamos supor que temos um parâmetro obrigatório em nossa requisição chamado estoque, e não queremos que o express prossiga nenhuma requisição sem que haja esse dado, no caso poderíamos fazer:

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

const server = express();

server.use(bodyParser.json())

server.use( (req, res, next) => {
    const { estoque } = req.body;
    if(!estoque || estoque < 500)
        return res.status(400).json({error: "Estoque não encontrado"})
    next();
})

server.get("/hello", (req, res) => {
    return res.send({...req.body, hello: "world"})
})

server.listen(3000, () => console.log("server listen 3000"));

No caso, antes de começar as rotas da nossa aplicação, podemos utilizar o use para adicionar a nossa middleware de validação, se houver algum problema com a requisição podemos lançar um erro e interromper, caso contrário seguímos a execução com o parâmetro extra next

Agora, caso não seja isso que você quis dizer, poderia dar um exemplo do que de fato você pretende fazer?

Abraços e Bons Estudos!

Olá,

Isso mesmo que estou querendo.

O que quero fazer é uma função que atualiza o banco de dados.

Se essa função ocorrer bem o expresse executa se não ele dá erro e para.

Atenciosamente,

André Oliveira

Olá,

Isso mesmo que estou querendo.

O que quero fazer é uma função que atualiza o banco de dados.

Se essa função ocorrer bem o expresse executa se não ele dá erro e para.

Atenciosamente,

André Oliveira

Olá,

Uma dúvida, o use é exercitado nessa ordem que é implementada, ou seja, nesse caso do sei código vai executar primeiro o paprse depois o estoque,.se eu trocar a ordem ele troca a execução? Ou essa execução é assincrona?

Atenciosamente,

André Oliveira

solução!

Olá Andre, tudo bem?

Peço perdão pela demora, estava participando da finalização da Imersão React da Alura :)

se eu trocar a ordem ele troca a execução? Ou essa execução é assincrona?

Ele troca a ordem e execução!

Podemos pensar os middlewares como correntes, então no código que eu mostrei cada use é como se fosse um nó da corrente, no caso:

Requisição ----- [ Body Parser ] ----- [ Estoque ] ----- [Rotas da Aplicação] ---- [ Outras....]

Se você trocar a ordem, será executado primeiro o Estoque e ai teremos um erro pois não fizemos o parse da requisição, então os dados ainda não estão como um objeto javascript e o nosso código não funcionaria :)

Se essa função ocorrer bem o expresse executa se não ele dá erro e para.

Bem, o que cabe pensar é se queremos executar essa função para todas as requisições, caso a resposta seja sim, então você pode tranquilamente fazer:

app.use( (req, res, next) => {
    ... lógica da função do banco de dados
    return res.status().json() ....
    next()
}

Onde utilizará o return para interromper o fluxo da requisição, e o next para chamar o próximo da corrente, tendo algo parecido como:

Requisição -----  [Body Parser] ----[ Middleware Banco de Dados] ----- [ Rotas da Aplicação]

Abraços e Bons Estudos!