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

Método Head não executa

Olá,

Implementei o método da rota de produtos roteador.head('/:id', async (requisicao, resposta, proximo) => {... que tem a função de retornar informações no cabeçalho da resposta, e este método fica depois do método roteador.get('/:id', async (requisicao, resposta, proximo) => {.. e tem a função de retornar dados no cabeçalho e informações no corpo da resposta.

Porém ao tentar fazer uma chamada pelo Postman para este método roteador.head, o Express executa o método roteador.get e não executa o método roteador.head.

Se eu inverto a ordem dos método, ou seja, declarando primeiro o método roteador.head e depois o método roteador.get, então o Express executa o método roteador.head normalmente, mas aí quando tento executar uma chamada pelo postam para o método roteador.get recebo um 404.

meu código:

roteador.get('/:id', async (requisicao, resposta, proximo) => {
  try {
      const dados = {
          id: requisicao.params.id,
          fornecedor: requisicao.fornecedor.id
      }
      const produto = new ProdutoModel(dados)

      await produto.carregar()

      const serializador = new SerializadorProduto(
          resposta.getHeader('Content-Type'), 
          ['preco', 'estoque', 'fornecedor', 'dataCriacao', 'dataAtualizacao', 'versao']
      )

      resposta.set('ETag', produto.versao)

      const timestamp = (new Date(produto.dataAtualizacao)).getTime()
      resposta.set('Last-Modified', timestamp)

      resposta.status(202) // obs. status 202 só para fins de teste
      resposta.send(
          serializador.serializar(produto)
      )

  } catch (error) {
    console.log(' \n>>> ', error, '\n');
    proximo(error)
  }
})

roteador.head('/:id', async (requisicao, resposta, proximo) => {
  try {
    const dados = {
        id: requisicao.params.id,
        fornecedor: requisicao.fornecedor.id
    }
    const produto = new ProdutoModel(dados)

    await produto.carregar()

    resposta.set('ETag', produto.versao)

    const timestamp = (new Date(produto.dataAtualizacao)).getTime()
    resposta.set('Last-Modified', timestamp)

    resposta.status(205) // obs. status 205 só para fins de teste...
    resposta.end()

  } catch (error) {
    proximo(error)
  }
})

Minha chamada via Postman para o método HEAD mas executando o método GET no Express

Requisição via postman

Alguém sabe qual pode ser o motivo?

2 respostas
solução!

Bem, após uma pesquisa mais detalhada, encontrei na documentação do Express que realmente este é um comportamento esperado...

Talvez o instrutor durante o vídeo nem tenha se apercebido, devido ao retorno do método 200 de OK.

Insira aqui a descrição dessa imagem para ajudar na acessibilidade

Para resolver este problema, basicamente utilizei a função .route e meu código ficou com a seguinte estrutura:

roteador.route('/:id')
    .get(async (requisicao, resposta, proximo) => { ... })
    .head(async (requisicao, resposta, proximo) => { ... })

Boa tarde Gregori, tudo certo?

Muito obrigado por este tópico! Você deu uma ótima explicação e trouxe a documentação como embasamento. Agradeço por você compartilhar o conhecimento com a comunidade aqui no fórum e adicionar essas informações.

Realmente, durante o processo de produção dos cursos alguns detalhes passam batido, pois existe um fluxo de informação muito grande para a realização dos projetos e é muito difícil não deixar que alguns detalhes passem sem verificação. Fico feliz que você tenha a compreensão.

Continue assim e bons estudos!