Si usa Express (desarrollo web de alto rendimiento y alta clase para Node.js), puede hacer esto:
HTML:
<form method="post" action="/">
<input type="text" name="user[name]">
<input type="text" name="user[email]">
<input type="submit" value="Submit">
</form>
Cliente API:
fetch('/', {
method: 'POST',
headers: {
'Content-Type': 'application/json'
},
body: JSON.stringify({
user: {
name: "John",
email: "[email protected]"
}
})
});
Node.js: (desde Express v4.16.0)
// Parse URL-encoded bodies (as sent by HTML forms)
app.use(express.urlencoded());
// Parse JSON bodies (as sent by API clients)
app.use(express.json());
// Access the parse results as request.body
app.post('/', function(request, response){
console.log(request.body.user.name);
console.log(request.body.user.email);
});
Node.js: (para Express <4.16.0)
const bodyParser = require("body-parser");
/** bodyParser.urlencoded(options)
* Parses the text as URL encoded data (which is how browsers tend to send form data from regular forms set to POST)
* and exposes the resulting object (containing the keys and values) on req.body
*/
app.use(bodyParser.urlencoded({
extended: true
}));
/**bodyParser.json(options)
* Parses the text as JSON and exposes the resulting object on req.body.
*/
app.use(bodyParser.json());
app.post("/", function (req, res) {
console.log(req.body.user.name)
});
app.use(express.bodyParser());
.Puedes usar el
querystring
módulo:Ahora, por ejemplo, si tiene un
input
campo con nombreage
, puede acceder a él utilizando la variablepost
:fuente
var POST = qs.parse(body); // use POST
solo para novatos como yo: cuando el nombre del campo de texto de entrada es "usuario",Post.user
mostrará los datos de ese campo. por ejemploconsole.log(Post.user);
readable
devolución de llamada en lugar de construir los datos en una cadena de cuerpo. Una vez que se dispara, el cuerpo está disponible a través derequest.read();
req.connection.destroy();
no impide que se ejecuten las devoluciones de llamada! Por ejemplo, la devolución de llamada "al final" se ejecutará con el cuerpo truncado. Esto probablemente no es lo que quiere ...¡Asegúrate de cerrar la conexión si alguien intenta inundar tu RAM!
fuente
var POST = qs.parse(body); // use POST
solo para novatos: cuando el nombre del campo de texto de entrada es "usuario", Post.user mostrará los datos de ese campo. eg console.log (Post.user);Muchas de las respuestas aquí ya no son buenas prácticas o no explican nada, así que por eso estoy escribiendo esto.
Lo esencial
Cuando se llama a la devolución de llamada de http.createServer, es cuando el servidor ha recibido todos los encabezados de la solicitud, pero es posible que los datos aún no se hayan recibido, por lo que tenemos que esperar. El objeto de solicitud http (una instancia de http.IncomingMessage) es en realidad una secuencia legible . En transmisiones legibles cada vez que llega un fragmento de datos, se emite un evento (suponiendo que haya registrado una devolución de llamada) y cuando todos los fragmentos han llegado se emite un evento. Aquí hay un ejemplo de cómo escuchas los eventos:
data
end
Convertir buffers en cadenas
Si intenta esto, notará que los trozos son amortiguadores . Si no está tratando con datos binarios y necesita trabajar con cadenas, sugiero usar el método request.setEncoding que hace que la secuencia emita cadenas interpretadas con la codificación dada y maneja los caracteres de varios bytes correctamente.
Trozos de búfer
Ahora probablemente no esté interesado en cada fragmento por sí mismo, por lo que en este caso probablemente desee almacenarlo de la siguiente manera:
Aquí se usa Buffer.concat , que simplemente concatena todos los buffers y devuelve un gran buffer. También puede usar el módulo concat-stream que hace lo mismo:
Analizando contenido
Si está intentando aceptar el envío POST de formularios HTML sin archivos o si está recibiendo llamadas jQuery ajax con el tipo de contenido predeterminado, entonces el tipo de contenido es
application/x-www-form-urlencoded
conuft-8
codificación. Puede usar el módulo de cadena de consulta para deserializarlo y acceder a las propiedades:Si su tipo de contenido es JSON, simplemente puede usar JSON.parse en lugar de qs.parse .
Si está tratando con archivos o manejando un tipo de contenido multiparte, entonces en ese caso, debe usar algo como formidable que elimine todo el dolor de lidiar con él. Eche un vistazo a esta otra respuesta mía donde publiqué enlaces y módulos útiles para contenido de varias partes.
Tubería
Si no desea analizar el contenido, sino pasarlo a otro lugar, por ejemplo, envíelo a otra solicitud http como datos o guárdelo en un archivo, sugiero canalizarlo en lugar de almacenarlo en el búfer, ya que será menos código, maneja mejor la contrapresión, tomará menos memoria y en algunos casos más rápido.
Entonces, si desea guardar el contenido en un archivo:
Limitar la cantidad de datos
Como otras respuestas han señalado, tenga en cuenta que los clientes malintencionados pueden enviarle una gran cantidad de datos para bloquear su aplicación o llenar su memoria, para protegerlo y asegurarse de que descarta las solicitudes que emiten datos que pasan un cierto límite. Si no usa una biblioteca para manejar los datos entrantes. Sugeriría usar algo como el medidor de flujo que puede cancelar la solicitud si alcanza el límite especificado:
o
o
Módulos NPM
Si bien describí anteriormente cómo puede usar el cuerpo de solicitud HTTP, simplemente para almacenar en búfer y analizar el contenido, sugiero usar uno de estos módulos en lugar de implementarlo por su cuenta, ya que probablemente manejarán mejor los casos extremos. Para expresar, sugiero usar body-parser . Para koa, hay un módulo similar .
Si no usa un marco, el cuerpo es bastante bueno.
fuente
request
se reutilice yrequest.on('end')
se invoque varias veces? ¿Cómo puedo evitar eso?request.on('end', ...)
se llamará.Aquí hay un contenedor sin marco muy simple basado en las otras respuestas y artículos publicados aquí:
Ejemplo de uso:
fuente
response.post
más lógicorequest.post
. Actualicé la publicación.Será más limpio si codifica sus datos a JSON y luego los envía a Node.js.
fuente
qs.parse()
,JSON.parse()
convirtió el cuerpo en algo utilizable. Ejemplo:,var post = JSON.parse(body);
luego acceda a los datos conpost.fieldname
. (Moraleja de la historia, si estás confundido acerca de lo que estás viendo, ¡no te olvidestypeof
!)request.setEncoding
para que esto funcione correctamente; de lo contrario, es posible que no maneje caracteres no ASCII correctamente.Para cualquiera que se pregunte cómo hacer esta tarea trivial sin instalar un marco web, logré hacer esto juntos. Apenas listo para la producción pero parece funcionar.
fuente
Puede usar
body-parser
el middleware de análisis del cuerpo de Node.js.Primera carga
body-parser
Algún código de ejemplo
Puede encontrar más documentación aquí.
fuente
Referencia: https://nodejs.org/en/docs/guides/anatomy-of-an-http-transaction/
fuente
Aquí es cómo puede hacerlo si usa formidable de nodo :
fuente
Si prefiere usar Node.js puro, puede extraer datos POST como se muestra a continuación:
fuente
1) Instalar
'body-parser'
desde npm.2) Luego en tu app.ts
3) entonces necesitas escribir
en el módulo app.ts
4) ten en cuenta que incluyes
en la parte superior o antes de cualquier declaración de módulo.
Ex:
5) Luego use
fuente
Si no desea agrupar sus datos junto con la
data
devolución de llamada, siempre puede usar lareadable
devolución de llamada de esta manera:Este enfoque modifica la solicitud entrante, pero tan pronto como termine su respuesta, la solicitud será recolectada de basura, por lo que no debería ser un problema.
Un enfoque avanzado sería verificar primero el tamaño del cuerpo, si tienes miedo de los cuerpos enormes.
fuente
request
es una secuencia normal de node.js, por lo que puede verificar larequest.headers
longitud del cuerpo y cancelar la solicitud si es necesario.Hay múltiples formas de hacerlo. Sin embargo, la forma más rápida que conozco es usar la biblioteca Express.js con body-parser.
Eso puede funcionar para cadenas, pero cambiaría bodyParser.urlencoded a bodyParser.json si los datos POST contienen una matriz JSON.
Más información: http://www.kompulsa.com/how-to-accept-and-parse-post-requests-in-node-js/
fuente
Debe recibir los
POST
datos en fragmentos utilizandorequest.on('data', function(chunk) {...})
Debería considerar agregar un límite de tamaño en la posición indicada como lo sugiere jh .
fuente
setTimeout
que finalice la conexión después de un cierto período de tiempo, si la solicitud completa no se recibe dentro de esa ventana.Express v4.17.0
fuente
Si está utilizando Express.js , antes de poder acceder a req.body, debe agregar el middleware bodyParser:
Entonces puedes pedir
fuente
Y si no desea utilizar todo el marco como Express, pero también necesita diferentes tipos de formularios, incluidas las cargas, entonces la formalina puede ser una buena opción.
Está listado en los módulos Node.js
fuente
Encontré un video que explica cómo lograr esto: https://www.youtube.com/watch?v=nuw48-u3Yrg
Utiliza el módulo predeterminado "http" junto con los módulos "querystring" y "stringbuilder". La aplicación toma dos números (usando dos cuadros de texto) de una página web y al enviarlos, devuelve la suma de esos dos (junto con la persistencia de los valores en los cuadros de texto). Este es el mejor ejemplo que pude encontrar en cualquier otro lugar.
Código fuente relacionado:
fuente
Para aquellos que usan carga POST binaria sin codificar, pueden usar:
cliente:
servidor:
fuente
Puede usar el middleware express , que ahora tiene incorporado un analizador de cuerpo. Esto significa que todo lo que necesita hacer es lo siguiente:
Ese ejemplo de código es ES6 con Express 4.16.x
fuente
puede extraer el parámetro de publicación sin usar express.
1:
nmp install multiparty
2: importar multiparte. como
var multiparty = require('multiparty');
3: `
4: y HTML FORM IS.
Espero que esto funcione para tí. Gracias.
fuente
Limite el tamaño de la POST para evitar inundar su aplicación de nodo. Hay un excelente módulo de cuerpo sin procesar , adecuado tanto para Express como para Connect, que puede ayudarlo a limitar la solicitud por tamaño y longitud.
fuente
Si implica la carga de un archivo, el navegador generalmente lo envía como un
"multipart/form-data"
tipo de contenido. Puedes usar esto en tales casosReferencia 1
Referencia 2
fuente
En campos de formulario como estos
algunas de las respuestas anteriores fallarán porque solo admiten datos planos.
Por ahora estoy usando la respuesta Casey Chu pero con el "qs" en lugar del módulo "querystring". Este es también el módulo que utiliza "body-parser" . Entonces, si desea datos anidados, debe instalar qs.
Luego reemplace la primera línea como:
fuente
Puede enviar y obtener fácilmente la respuesta de la solicitud POST utilizando "Solicitud - Cliente HTTP simplificado" y Promesa Javascript.
fuente
Debe usar bodyParser () si desea que los datos del formulario estén disponibles en req.body. body-parser analiza su solicitud y la convierte a un formato desde el cual puede extraer fácilmente la información relevante que pueda necesitar.
Por ejemplo, supongamos que tiene un formulario de registro en su interfaz. Lo está completando y solicita al servidor que guarde los detalles en alguna parte.
Extraer el nombre de usuario y la contraseña de su solicitud es tan simple como a continuación si usa body-parser.
…………………………………………………….
fuente
ONE LINER sin MIDDLEWARE
Si publica los siguientes datos,
'name':'ABC'
puede analizarlos utilizando el siguiente liner,
fuente