req.body vazio nos posts

De repente, isso vem acontecendo em todos os meus projetos.

Sempre que eu faço um post em nodejs usando express e body-parser req.body é um object 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.

Eu tentei configurar manualmente o tipo de Content-type : application/json no primeiro, mas eu sempre obter 400 bad request

Isso tem me deixado louco.

Eu pensei que era algo atualizado no body-parser mas eu rebaixei e isso não ajudou.

Qualquer ajuda apreciada, obrigado.

Em Postman das 3 opções disponíveis para o tipo de conteúdo, selecione “X-www-form-urlencoded” e isso deve funcionar.

Também para se livrar da substituição da mensagem de erro:

 app.use(bodyParser.urlencoded()) 

Com:

 app.use(bodyParser.urlencoded({ extended: true })); 

Veja https://github.com/expressjs/body-parser

O middleware ‘body-parser’ manipula somente dados JSON e urlencoded, não multipart

Com o Postman, para testar as ações de postagem HTTP com uma carga útil de dados JSON bruta, selecione a opção raw e defina os seguintes parâmetros de header:

 Content-Type: application/json 

Além disso, certifique-se de envolver quaisquer cadeias usadas como chaves / valores em sua carga JSON entre aspas duplas.

O pacote body-parser analisará bem as cargas úteis JSON de várias linhas.

 { "foo": "bar" } 

Testado no Chrome v37 e v41 com a extensão Postman v0.8.4.13 ( body-parser v1.12.2 e express v4.12.3) com a configuração abaixo:

 var express = require('express'); var app = express(); var bodyParser = require('body-parser'); // configure the app to use bodyParser() app.use(bodyParser.urlencoded({ extended: true })); app.use(bodyParser.json()); // ... Your routes and methods here 

Carteiro json carga útil

Eu cometi um erro realmente estúpido e esqueci de definir atributos de name para inputs no meu arquivo html.

Então, ao invés de

  

Eu tenho isto.

  

Agora request.body é preenchido assim: { password: 'hhiiii' }

Eu corri para este problema hoje, e o que foi consertado foi remover o header do tipo de conteúdo no Postman! Muito estranho. Adicionando aqui caso isso ajude alguém.

Eu estava seguindo o tutorial BeerLocker aqui: http://scottksmith.com/blog/2014/05/29/beer-locker-building-a-restful-api-with-node-passport/

Descobri, que funciona ao enviar com tipo de conteúdo

“aplicativo / json”

em combinação com o lado do servidor

app.use(bodyParser.json());

Agora eu posso enviar via

 var data = {name:"John"} var xmlHttp = new XMLHttpRequest(); xmlHttp.open("POST", theUrl, false); // false for synchronous request xmlHttp.setRequestHeader("Content-type", "application/json"); xmlHttp.send(data); 

e o resultado está disponível em request.body.name no servidor.

Mesmo quando eu estava aprendendo o node.js pela primeira vez em que comecei a aprender sobre o web-app, eu estava tendo todas essas coisas bem feitas na minha forma, ainda assim não consegui receber valores no post request. Depois de uma longa debugging, descobri que na forma forneci enctype="multipart/form-data" devido ao qual não consegui obter valores. Eu simplesmente removi e funcionou para mim.

Um problema semelhante aconteceu comigo, eu 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 qualquer um que tenha o mesmo problema.

 router.post('/', function(req, res){}); 

Parece que se você não usar nenhum encType (o padrão é application/x-www-form-urlencoded ), então você obtém campos de input de texto, mas não obteria o arquivo.

Se você tiver um formulário para o qual deseja enviar input e arquivo de texto, use o tipo de codificação multipart/form-data e, além disso, use o middleware multer . Multer irá analisar o object request e preparar req.file para você e todos os outros campos de inputs estarão disponíveis através do req.body .

Certifique-se de que [“chave”: “tipo”, “valor”: “json”] & [“chave”: “Tipo de conteúdo”, “valor”: “aplicativo / x-www-forma-urlencodificado”] esteja na sua headers de solicitação de carteiro

Meu problema era que eu estava criando a rota primeiro

 // ... router.get('/post/data', myController.postHandler); // ... 

e registrando o middleware após a rota

 app.use(bodyParser.json()); //etc 

devido à estrutura do aplicativo e copiar e colar o projeto juntos a partir de exemplos.

Depois que eu fixei o pedido para registrar o middleware antes da rota, tudo funcionou.

Você precisa verificar se o middleware do analisador de corpo está configurado corretamente para o tipo de solicitação (json, urlencoded).

Se você tiver definido,

 app.use(bodyParser.json()); 

então no carteiro você tem que enviar os dados como brutos.

https://i.stack.imgur.com/k9IdQ.png postman screenshot

Se você tiver definido,

 app.use(bodyParser.urlencoded({ extended: true })); 

então a opção ‘x-www-form-urlencoded’ deve ser selecionada.

Eu estava usando o restify ao invés de express e corri para o mesmo problema. a solução era fazer:

server.use (restify.bodyParser ());

Eu resolvi isso usando multer como sugerido acima, mas eles perderam dando um exemplo completo de trabalho, sobre como fazer isso. Basicamente isso pode acontecer quando você tem um grupo de formulários com enctype="multipart/form-data" . Aqui está o HTML para o formulário que eu tinha:

 

E aqui está como usar o multer para obter os valores e nomes desse formulário com Express.js e node.js :

 var multer = require('multer') var upload = multer({ dest: './public/data/uploads/' }) app.post('/stats', upload.single('uploaded_file'), function (req, res) { // req.file is the name of your file in the form above, here 'uploaded_file' // req.body will hold the text fields, if there were any console.log(req.file, req.body) }); 

você não deve fazer JSON.stringify (dados) ao enviar através de AJAX como abaixo

 this is not correct code function callAjax(url, data) { $.ajax({ url: url, type: "POST", data: JSON.stringify(data), success: function(d) { alert("successs "+ JSON.stringify(d)); } }); } 

o código correto é

 function callAjax(url, data) { $.ajax({ url: url, type: "POST", data: data, success: function(d) { alert("successs "+ JSON.stringify(d)); } }); }