De repente, isso vem acontecendo em todos os meus projetos.
Sempre que eu faço uma postagem no nodejs usando express e body-parser, req.body
é um objeto vazio.
var express = require('express')
var bodyParser = require('body-parser')
var app = express()
// parse application/x-www-form-urlencoded
app.use(bodyParser.urlencoded())
// parse application/json
app.use(bodyParser.json())
app.listen(2000);
app.post("/", function (req, res) {
console.log(req.body) // populated!
res.send(200, req.body);
});
Via ajax e carteiro, está sempre vazio.
No entanto, via curl
$ curl -H "Content-Type: application/json" -d '{"username":"xyz","password":"xyz"}' http://localhost:2000/
funciona como pretendido.
Tentei configurar manualmente Content-type : application/json
no primeiro, mas sempre obtive400 bad request
Isso está me deixando louco.
Eu pensei que era algo atualizado no analisador de corpo, mas fiz o downgrade e não ajudou.
Qualquer ajuda apreciada, obrigado.
Content-Type
carteiro? Caso contrário, você pode tentar isso, pois já tive problemas antes com o carteiro não enviando umContent-Type
.Respostas:
No Postman, das 3 opções disponíveis para o tipo de conteúdo, selecione "X-www-form-urlencoded" e deve funcionar.
Também para se livrar da mensagem de erro, substitua:
Com:
Consulte https://github.com/expressjs/body-parser
O middleware 'body-parser' manipula apenas JSON e dados codificados por url, não multipartes
fonte
app.use(express.json());
Com o Postman, para testar ações de postagem HTTP com uma carga de dados JSON bruta, selecione a
raw
opção e defina os seguintes parâmetros de cabeçalho:Além disso, certifique-se de agrupar todas as cadeias usadas como chaves / valores em sua carga JSON entre aspas duplas.
O
body-parser
pacote analisará as cargas úteis JSON brutas de várias linhas.Testado no Chrome v37 e v41 com a extensão Postman v0.8.4.13 (
body-parser
v1.12.2 eexpress
v4.12.3) com a configuração abaixo:fonte
form-data
no Postman para postar os dados, eu sempre recebo{}
o req.body. Devo definir aContent-Type
opção?Cometi um erro muito idiota e esqueci de definir
name
atributos para entradas no meu arquivo html.Então, ao invés de
Eu tenho isto.
Agora
request.body
é preenchido assim:{ password: 'hhiiii' }
fonte
Eu descobri que funciona ao enviar com o tipo de conteúdo
em combinação com o lado do servidor
app.use(bodyParser.json());
Agora eu posso enviar via
e o resultado está disponível no
request.body.name
servidor.fonte
xmlHttp.send(JSON.stringify(data));
Encontrei esse problema hoje, e o que foi corrigido foi remover o cabeçalho do tipo de conteúdo no Postman! Muito estranho. Adicioná-lo aqui, caso ajude alguém.
Eu estava seguindo o tutorial do BeerLocker aqui: http://scottksmith.com/blog/2014/05/29/beer-locker-building-a-restful-api-with-node-passport/
fonte
Você deve verificar se o middleware body-parser está definido corretamente para o tipo de solicitação (json, codificado por url).
Se você configurou,
então, no carteiro, você deve enviar os dados como não processados.
https://i.stack.imgur.com/k9IdQ.png captura de tela do carteiro
Se você configurou,
a opção 'x-www-form-urlencoded' deve ser selecionada.
fonte
Meu problema era que eu estava criando a rota primeiro
e registrando o middleware após a rota
devido à estrutura do aplicativo, copiar e colar o projeto a partir de exemplos.
Depois de corrigir o pedido de registro do middleware antes da rota, tudo funcionou.
fonte
Mesmo quando eu estava aprendendo o node.js pela primeira vez em que comecei a aprendê-lo pelo aplicativo da web, eu estava fazendo tudo isso de maneira adequada no meu formulário, ainda não consegui receber valores em uma solicitação posterior. Após uma longa depuração, vim a saber que, no formulário que forneço
enctype="multipart/form-data"
devido ao qual não consegui obter valores. Eu simplesmente o removi e funcionou para mim.fonte
enctype="multipart/form-data"
multer
- ver documentação sobre npmjs.com/package/multerParece que se você não usar nenhum encType (o padrão é
application/x-www-form-urlencoded
), receberá campos de entrada de texto, mas não obterá o arquivo.Se você possui um formulário no qual deseja postar entrada e arquivo de texto, use o
multipart/form-data
tipo de codificação e, além disso, use omulter
middleware. Multer analisará o objeto de solicitação e se prepararáreq.file
para você e todos os outros campos de entrada estarão disponíveisreq.body
.fonte
multer
foi realmente a solução para o meu problema. Seria bom se você pudesse adicionar um exemplo de como usar isso como parte de sua respostaUm problema semelhante aconteceu comigo, simplesmente misturei a ordem dos parâmetros de retorno de chamada. Verifique se você está configurando as funções de retorno de chamada na ordem correta. Pelo menos para quem tem o mesmo problema.
fonte
Verifique se ["key": "type", "value": "json"] e ["key": "Content-Type", "value": "application / x-www-form-urlencoded"] estão no seu cabeçalhos de solicitação de carteiro
fonte
Resolvi isso usando
multer
o sugerido acima, mas eles deixaram de dar um exemplo de trabalho completo sobre como fazer isso. Basicamente, isso pode acontecer quando você tem um grupo de formuláriosenctype="multipart/form-data"
. Aqui está o HTML para o formulário que eu tinha:E aqui está como usar
multer
para obter os valores e nomes deste formulário comExpress.js
enode.js
:fonte
Eu tive o mesmo problema alguns minutos atrás, tentei todo o possível nas respostas acima, mas qualquer uma delas funcionou.
A única coisa que fiz foi atualizar a versão do Node JS, não sabia que a atualização poderia afetar alguma coisa, mas foi.
Instalei a versão JS do nó
10.15.0
( versão mais recente), retornei8.11.3
e tudo está funcionando agora. Talvez obody-parser
módulo deva resolver isso.fonte
Eu não tinha o nome na minha entrada ... meu pedido estava vazio ... feliz que tenha terminado e eu possa continuar codificando. Obrigado a todos!
Resposta que usei por Jason Kim:
Então, ao invés de
eu tenho isto
fonte
você não deve
JSON.stringify(data)
enviar o AJAX como abaixo.Este não é o código correto:
O código correto é:
fonte
Se você estiver trabalhando com o carteiro, confirme essas coisas ao solicitar a API
fonte
Eu estava usando restify em vez de express e encontrei o mesmo problema. A solução foi fazer:
fonte
Eu acredito que isso pode resolver
app.use(express.json());
fonte
Altere
app.use(bodyParser.urlencoded());
seu código parae no carteiro, no cabeçalho, altere o
Content-Type
valor deapplication/x-www-form-urlencoded
paraapplication/json
Ta :-)
fonte
Obrigado a todos pelas ótimas respostas! Passei bastante tempo procurando uma solução e, do meu lado, estava cometendo um erro elementar: estava ligando
bodyParser.json()
de dentro da função:Eu só precisava fazer
app.use(['/password'], bodyParser.json())
e funcionou ...fonte
No carteiro, mesmo depois de seguir a resposta aceita, eu estava recebendo um corpo de solicitação vazio. O problema acabou por não passar um cabeçalho chamado
Esse cabeçalho estava presente por padrão (junto com outros 5) que eu desabilitei. Habilite isso e você receberá o corpo da solicitação.
fonte
Meu problema foi criar a rota primeiro
require("./routes/routes")(app);
, mudei para o final do código antesapp.listen
e funcionou!fonte