Eu tenho isso como configuração do meu servidor Express
app.use(app.router);
app.use(express.cookieParser());
app.use(express.session({ secret: "keyboard cat" }));
app.set('view engine', 'ejs');
app.set("view options", { layout: true });
//Handles post requests
app.use(express.bodyParser());
//Handles put requests
app.use(express.methodOverride());
Mas ainda assim, quando solicito req.body.something
nas minhas rotas, recebo algum erro ao apontar isso body is undefined
. Aqui está um exemplo de uma rota que usa req.body
:
app.post('/admin', function(req, res){
console.log(req.body.name);
});
Eu li que esse problema é causado pela falta de, app.use(express.bodyParser());
mas como você pode ver, eu o chamo antes das rotas.
Qualquer pista?
As versões mais recentes do Express (4.x) separaram o middleware da estrutura principal. Se você precisar de analisador de corpo, precisará instalá-lo separadamente
e faça isso no seu código
fonte
app.use(bodyParser.urlencoded({ extended: false })); app.use(bodyParser.json())
me salvou !!Não. Você precisa usar
app.use(express.bodyParser())
antesapp.use(app.router)
. De fato,app.use(app.router)
deve ser a última coisa que você chama.fonte
app.use(app.router)
sob as.use
chamadas não resolve o problema :(.app.use(require('connect').bodyParser());
vez deapp.use(express.bodyParser());
.var router=express.Router()
;Primeiro, verifique se você instalou o módulo npm chamado 'body-parser' chamando:
Certifique-se de incluir as seguintes linhas antes de chamar rotas
fonte
O Express 4, possui um analisador de corpo incorporado. Não é necessário instalar um analisador de corpo separado. Então abaixo funcionará:
fonte
O cabeçalho Content-Type no pedido é realmente importante, especialmente quando você publica os dados do curl ou de qualquer outra ferramenta.
Verifique se você está usando algo como application / x-www-form-urlencoded, application / json ou outros, isso depende dos dados da postagem. Deixar este campo em branco confundirá o Express.
fonte
Como já postado em um comentário, resolvi usando
ao invés de
Ainda não sei por que o simples
express.bodyParser()
não está funcionando ...fonte
connect
módulo vianpm install connect
e tente novamente. Essa é a única coisa em que consigo pensar lendo a saída do seu erro.Content-Type
cabeçalhoapplication/json
.Content-Type
cabeçalhoapplication/json
quando eu estava fazendo meu pedido.application/json
vstext/json
na solicitação funciona, conforme sugerido por @GrantEagon.fonte
Adicione no seu
app.js
antes da chamada do roteador
fonte
Parece que o analisador de corpo não é mais enviado com express. Talvez seja necessário instalá-lo separadamente.
Consulte a página git https://github.com/expressjs/body-parser para obter mais informações e exemplos.
fonte
Caso alguém tenha o mesmo problema que eu estava tendo; Estou usando um prefixo de URL como
que foi configurado com o roteador
e então eu tive o seguinte
O que corrigiu meu problema foi colocar a configuração do bodyparser acima
app.use('/api', router);
Final
fonte
O express.bodyParser () precisa ser informado sobre que tipo de conteúdo é que está analisando. Portanto, você precisa garantir que, ao executar uma solicitação POST, inclua o cabeçalho "Tipo de conteúdo". Caso contrário, bodyParser pode não saber o que fazer com o corpo da sua solicitação POST.
Se você estiver usando curl para executar uma solicitação POST contendo algum objeto JSON no corpo, seria algo parecido com isto:
Se estiver usando outro método, apenas certifique-se de definir esse campo de cabeçalho usando qualquer convenção apropriada.
fonte
Use app.use (bodyparser.json ()); antes do roteamento. // app.use ("/ api", rotas);
fonte
Você pode tentar adicionar esta linha de código na parte superior (após as instruções de exigência):
Quanto aos motivos pelos quais funciona, confira os documentos: https://www.npmjs.com/package/body-parser#bodyparserurlencodedoptions
fonte
Na maioria das vezes, req.body é indefinido devido à falta do analisador JSON
pode estar faltando para o analisador de corpo
e às vezes é indefinido devido à origem das cros, então adicione-as
fonte
Isso ocorreu comigo hoje. Nenhuma das soluções acima funciona para mim. Mas um pouco de pesquisa no Google me ajudou a resolver esse problema. Estou codificando para o servidor de terceiros.
As coisas ficam um pouco mais complicadas quando o aplicativo node.js requer a leitura de dados POST de streaming, como uma solicitação de um cliente REST. Nesse caso, a propriedade da solicitação "legível" será configurada como true e os dados do POST deverão ser lidos em partes para coletar todo o conteúdo.
http://www.primaryobjects.com/CMS/Article144
fonte
Perdeu muito tempo:
Dependendo do tipo de conteúdo em sua solicitação de cliente,
o servidor deve ter diferentes, um dos app.use () abaixo:
Fonte: https://www.npmjs.com/package/body-parser#bodyparsertextoptions
Exemplo:
Para mim, no lado do cliente, eu tinha o cabeçalho abaixo:
Então, no lado do servidor, eu usei:
Então, req.body funcionou bem.
fonte
no Express 4, é realmente simples
fonte
Para funcionar, você precisa app.use (app.router) após app.use (express.bodyParser ()) , assim:
fonte
app.use
emapp.router
antesexpress.bodyParser
, mas seu código indica claramente que está atrás. Então qual é?Isso salvou meu dia.
fonte
Esse problema pode ocorrer porque você não usou o analisador de corpo ( link )
fonte
Eu o resolvi com:
fonte
Essa também é uma possibilidade : verifique se você deve escrever esse código antes da rota no arquivo app.js (ou index.js).
fonte
Você pode usar o analisador de corpo expresso.
fonte
A versão mais recente do Express já possui um analisador de corpo incorporado. Então você pode usar:
fonte
Caso você poste uma mensagem SOAP, precisará usar o analisador de corpo bruto:
fonte
Com base no @ kevin-xue, o tipo de conteúdo precisa ser declarado. Na minha instância, isso estava ocorrendo apenas no IE9 porque o XDomainRequest não define um tipo de conteúdo ; portanto, bodyparser e expressjs estavam ignorando o corpo da solicitação.
Eu resolvi isso definindo o tipo de conteúdo explicitamente antes de passar a solicitação para o analisador de corpo, da seguinte maneira:
fonte
Os nossos agradecimentos a @spikeyang pela excelente resposta (fornecida abaixo). Depois de ler o artigo sugerido anexado ao post, decidi compartilhar minha solução.
Quando usar?
A solução exigiu que você usasse o roteador expresso para aproveitá-lo .. so: Se você tentou usar a resposta aceita sem sorte, basta copiar e colar esta função:
e chame assim:
NOTA: Para cargas úteis grandes - use um buffer de matriz ( mais @ MDN )
fonte
Se você estiver usando alguma ferramenta externa para fazer a solicitação, adicione o cabeçalho:
Content-Type: application/json
fonte
Para quem não trabalhou nenhuma das respostas acima, tive que habilitar cors entre meu front-end e express.
Você pode fazer isso:
Baixando e ativando uma extensão CORS para o seu navegador, como:
https://chrome.google.com/webstore/detail/allow-control-allow-origi/nlfbmbojpeacfghkpbjhddihlkkiljbi?hl=en
para Chrome,
ou pela
Adicionando as linhas
para a sua
app.js
página expressa . (Depoisnpm install cors
)fonte