Tengo el siguiente 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();
});
Ahora si publico algo como:
curl -d user=Someone -H Accept:application/json --url http://localhost:5000
Me pongo Someone
como se esperaba. Ahora, ¿qué pasa si quiero obtener el cuerpo completo de la solicitud? Intenté hacerlo, response.write(request.body)
pero Node.js arroja una excepción que dice "el primer argumento debe ser una cadena o Buffer " y luego pasa a un "bucle infinito" con una excepción que dice " No se pueden establecer encabezados después de que se envían "; Esto también es cierto incluso si lo hice var reqBody = request.body;
y luego escribir response.write(reqBody)
.
¿Cuál es el problema aquí?
Además, ¿puedo obtener la solicitud sin procesar sin usar express.bodyParser()
?
javascript
node.js
express
El cielo azul
fuente
fuente
response.write(reqBody)
; cuando uso lasresponse.send(reqBody)
cosas funcionan bien ... y sí, usoresponse.end
despuésresponse.write
.Respuestas:
Express 4.0 y superior:
$ npm install --save body-parser
Y luego en su aplicación de nodo:
Express 3.0 y abajo:
Intente pasar esto en su llamada cURL:
--header "Content-Type: application/json"
y asegurándose de que sus datos estén en formato JSON:
{"user":"someone"}
Además, puede usar console.dir en su código node.js para ver los datos dentro del objeto como en el siguiente ejemplo:
Esta otra pregunta también podría ayudar: ¿Cómo recibir JSON en la solicitud POST express node.js?
Si no desea utilizar bodyParser, consulte esta otra pregunta: https://stackoverflow.com/a/9920700/446681
fuente
curl -d {"user":"Someone"} -H "Content-Type: application/json" --url http://localhost:5000
pero me estaba dando el error " Token inesperado u ", por eso cambié a la llamada mencionada en mi publicación original.express.bodyParser()
está en desuso en Express 4.x. Utilice npmjs.org/package/body-parser en su lugar.echo any"thing"
. Los datos que está publicando deben estar entre comillas para evitar que esto suceda.A partir de express v4.16 no hay necesidad de requerir ningún módulo adicional, solo use el middleware JSON incorporado :
Me gusta esto:
Nota:
body-parser
de esto depende, ya está incluido con express.Tampoco olvides enviar el encabezado
Content-Type: application/json
fuente
A partir de Express 4, el siguiente código parece hacer el truco. Tenga en cuenta que deberá instalar
body-parser
usandonpm
.fuente
app.use(bodyParser.json())
app.use(bodyParser.urlencoded({ extended: true })
está también requiere? Estoy publicando un documento bastante complejo como JSON en la solicitud, yextended: false
no funcionó. Solo cuando lo configuro en verdadero, la solicitud se analiza correctamente.app.use(bodyParser.urlencoded({ extended: true }));
ANDapp.use(bodyParser.json())
para obtener datos json en una configuración de servidor AWS Linux con NodeJS y Express.Esto te ayudara. Supongo que está enviando el cuerpo en json.
fuente
Para 2019, no necesita instalar
body-parser
.Puedes usar:
fuente
Esto puede lograrse sin
body-parser
la dependencia, así, escucharrequest:data
yrequest:end
y devolver la respuesta en el extremo de la solicitud, se refieren a continuación ejemplo de código. ref: https://nodejs.org/en/docs/guides/anatomy-of-an-http-transaction/#request-bodyfuente
Prueba esto:
Eso tomará el objeto que
bodyParser
ha creado para usted y lo convertirá en una cadena y lo escribirá en la respuesta. Si desea el cuerpo exacto de la solicitud (con el mismo espacio en blanco, etc.), necesitarádata
yend
escuchas adjuntos a la solicitud antes y acumulará la cadena fragmento por fragmento como puede ver en el código fuente de análisis json de connect .fuente
Lo que dice haber "intentado hacer" es exactamente lo que escribió en el código que funciona "como se esperaba" cuando lo invoca con curl.
El error que está recibiendo no parece estar relacionado con ninguno de los códigos que nos ha mostrado.
Si desea obtener la solicitud de prima, manipuladores en el set
request
para lasdata
yend
los acontecimientos (y, por supuesto, eliminar las invocaciones deexpress.bodyParser()
). Tenga en cuenta que losdata
eventos ocurrirán en fragmentos, y que a menos que establezca una codificación para eldata
evento, esos fragmentos serán buffers, no cadenas.fuente
request.body
y norequest.body.user
, y lo corregí ahora. Por cierto,var reqBody = request.body;
era correcto y sigue siendo correcto, y cuando lo pruebes obtendrás el error que estoy recibiendo. De todos modos, ¿puede dar un ejemplo sobre cómo configurar el controladorrequest
; Parece que no lo encuentro en la guía express.Si eres lo suficientemente flojo como para leer fragmentos de datos de publicaciones. simplemente puede pegar debajo de las líneas para leer json.
A continuación se muestra para TypeScript que también se puede hacer para JS.
app.ts
En uno de sus controladores que recibe llamadas POST, use como se muestra a continuación
userController.ts
fuente
Soy absolutamente nuevo en JS y ES, pero lo que parece funcionar para mí es solo esto:
¡Avísame si hay algo malo en ello!
fuente
Instale Body Parser con el siguiente comando
Configurar Body Parser
fuente
Utiliza el siguiente código para registrar datos de publicación:
fuente