Eu tenho o seguinte código Node.js:
var express = require('express');
var app = express.createServer(express.logger());
app.use(express.bodyParser());
app.post('/', function(request, response) {
response.write(request.body.user);
response.end();
});
Agora, se eu POST algo como:
curl -d user=Someone -H Accept:application/json --url http://localhost:5000
Eu fico Someone
como o esperado. Agora, e se eu quiser obter o corpo completo da solicitação? Eu tentei fazer, response.write(request.body)
mas o Node.js lança uma exceção dizendo "o primeiro argumento deve ser uma string ou um buffer " e depois passa para um "loop infinito", com uma exceção que diz " Não é possível definir cabeçalhos após o envio. "; isso também é verdade mesmo que eu fiz var reqBody = request.body;
e depois escrevi response.write(reqBody)
.
Qual é o problema aqui?
Além disso, posso obter a solicitação bruta sem usar express.bodyParser()
?
javascript
node.js
express
O céu azul
fonte
fonte
response.write(reqBody)
; quando uso asresponse.send(reqBody)
coisas estão funcionando bem ... e sim, usoresponse.end
depoisresponse.write
.Respostas:
Express 4.0 e superior:
$ npm install --save body-parser
E então no seu aplicativo de nó:
Express 3.0 e abaixo:
Tente passar isso na sua chamada cURL:
--header "Content-Type: application/json"
e verifique se seus dados estão no formato JSON:
{"user":"someone"}
Além disso, você pode usar console.dir no código node.js para ver os dados dentro do objeto, como no exemplo a seguir:
Essa outra pergunta também pode ajudar: Como receber JSON na solicitação expressa do node.js POST?
Se você não quiser usar o bodyParser, verifique esta outra pergunta: https://stackoverflow.com/a/9920700/446681
fonte
curl -d {"user":"Someone"} -H "Content-Type: application/json" --url http://localhost:5000
mas estava me dando o erro " Token inesperado u ", por isso mudei para a chamada mencionada na minha postagem original.express.bodyParser()
foi descontinuado no Express 4.x. Use npmjs.org/package/body-parser .echo any"thing"
. Os dados que você está postando devem estar entre aspas para impedir que isso aconteça.A partir do express v4.16, não há necessidade de módulos adicionais, basta usar o middleware JSON integrado :
Como isso:
Nota -
body-parser
, da qual isso depende, já está incluído no express.Também não se esqueça de enviar o cabeçalho
Content-Type: application/json
fonte
No Express 4, o código a seguir parece fazer o truque. Observe que você precisará instalar
body-parser
usandonpm
.fonte
app.use(bodyParser.json())
app.use(bodyParser.urlencoded({ extended: true })
é também necessário? Estou postando um documento bastante complexo como JSON na solicitação eextended: false
não funcionou. Somente quando eu defini-lo como verdadeiro, a solicitação é analisada corretamente.app.use(bodyParser.urlencoded({ extended: true }));
ANDapp.use(bodyParser.json())
para obter dados json em uma configuração de servidor da AWS Linux com NodeJS e Express.Isso irá ajudá-lo. Presumo que você esteja enviando corpo em json.
fonte
Para 2019, você não precisa instalar
body-parser
.Você pode usar:
fonte
Isto pode ser conseguido sem
body-parser
dependência, bem como, ouvirrequest:data
erequest:end
e retornar a resposta no final da requisição, referem-se a seguir exemplo de código. ref: https://nodejs.org/en/docs/guides/anatomy-of-an-http-transaction/#request-bodyfonte
Tente o seguinte:
Isso pegará o objeto
bodyParser
criado para você e o transformará novamente em uma sequência de caracteres e gravará na resposta. Se quiser que o corpo da solicitação exata (com o mesmo espaço em branco, etc), você vai precisardata
eend
ouvintes anexado ao pedido antes e construir o pedaço de cordas de pedaço como você pode ver no código-fonte de análise JSON de conexão .fonte
O que você afirma ter "tentado fazer" é exatamente o que você escreveu no código que funciona "como esperado" quando você o invoca com curl.
O erro que você está recebendo não parece estar relacionado a nenhum código que você nos mostrou.
Se você deseja obter o pedido cru, manipuladores em conjunto
request
para osdata
eend
eventos (e, claro, remover qualquer invocações deexpress.bodyParser()
). Observe que osdata
eventos ocorrerão em partes, e que, a menos que você defina uma codificação para odata
evento, essas partes serão buffers, não cadeias.fonte
request.body
e nãorequest.body.user
, e eu o corrigi agora. A propósito, ovar reqBody = request.body;
foi e ainda está correto e, quando você tentar, receberá o erro que estou recebendo. De qualquer forma, você pode dar um exemplo sobre como ativar o manipuladorrequest
; Não parece encontrá-lo em guia expresso.Se você tiver preguiça de ler blocos de dados de postagem. você pode simplesmente colar as linhas abaixo para ler json.
Abaixo está o TypeScript semelhante também pode ser feito para JS.
app.ts
Em um dos controladores que recebe chamadas POST, use como mostrado abaixo
userController.ts
fonte
Eu sou absolutamente novo em JS e ES, mas o que parece funcionar para mim é apenas isso:
Deixe-me saber se há algo errado com isso!
fonte
Instale o Analisador de Corpo pelo comando abaixo
Configurar analisador de corpo
fonte
Você usa o seguinte código para registrar dados da postagem:
fonte