Cómo recuperar los parámetros de consulta POST?


Aquí está mi forma simple:

<form id="loginformA" action="userlogin" method="post">
    <div>
        <label for="email">Email: </label>
        <input type="text" id="email" name="email"></input>
    </div>
<input type="submit" value="Submit"></input>
</form>

Aquí está mi Expreso.js/Node.código js:

app.post('/userlogin', function(sReq, sRes){    
    var email = sReq.query.email.;   
}

Intenté sReq.query.email o sReq.query['email'] o sReq.params['email'], etc. Ninguno de ellos funciona. Todos regresan undefined.

Cuando cambio a una llamada Get, funciona, así .. alguna idea?

Author: GG., 2011-04-19

18 answers

Las cosas han cambiado una vez más a partir de Express 4.16.0, ahora puede usar express.json() y express.urlencoded()al igual que en Express 3.0.

Esto fue diferente comenzando Express 4.0 a 4.15:

$ npm install --save body-parser

Y luego:

var bodyParser = require('body-parser')
app.use( bodyParser.json() );       // to support JSON-encoded bodies
app.use(bodyParser.urlencoded({     // to support URL-encoded bodies
  extended: true
})); 

El resto es como en Express 3.0:

En primer lugar, debe agregar algún middleware para analizar los datos post del cuerpo.

Añádase una o las dos líneas siguientes de código:

app.use(express.json());       // to support JSON-encoded bodies
app.use(express.urlencoded()); // to support URL-encoded bodies

Luego, en su controlador, use el req.body objeto:

// assuming POST: name=foo&color=red            <-- URL encoding
//
// or       POST: {"name":"foo","color":"red"}  <-- JSON encoding

app.post('/test-page', function(req, res) {
    var name = req.body.name,
        color = req.body.color;
    // ...
});

Tenga en cuenta que el uso de express.bodyParser() no se recomienda.

app.use(express.bodyParser());

Equivalent es equivalente a:

app.use(express.json());
app.use(express.urlencoded());
app.use(express.multipart());

Existen problemas de seguridad con express.multipart(), por lo que es mejor agregar explícitamente soporte para los tipos de codificación específicos que necesita. Si necesita codificación multiparte (para soportar la carga de archivos, por ejemplo), entonces debe leer esto.

 1074
Author: Drew Noakes,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-12-27 18:38:10

Nota : esta respuesta es para Express 2. Ver aquí para Express 3.

Si está utilizando connect/express, debe usar el middleware bodyParser: Se describe en la guía Expressjs.

// example using express.js:
var express = require('express')
  , app = express.createServer();
app.use(express.bodyParser());
app.post('/', function(req, res){
  var email = req.param('email', null);  // second parameter is default
});

Aquí está la versión original de solo conexión:

// example using just connect
var connect = require('connect');
var url = require('url');
var qs = require('qs');
var server = connect(
  connect.bodyParser(),
  connect.router(function(app) {
    app.post('/userlogin', function(req, res) {
      // the bodyParser puts the parsed request in req.body.
      var parsedUrl = qs.parse(url.parse(req.url).query);
      var email = parsedUrl.email || req.body.email;;
    });
  })
);

Tanto el querystring como el body se analizan usando el manejo de parámetros de estilo Rails(qs) en lugar de la biblioteca de bajo nivel querystring . Con el fin de analizar repetido parámetros con qs, el parámetro necesita tener corchetes: name[]=val1&name[]=val2. También soporta mapas anidados. Además de analizar los envíos de formularios HTML, el bodyParser puede analizar automáticamente las solicitudes JSON.

Edit : He leído en express.js y modifiqué mi respuesta para que fuera más natural para los usuarios de Express.

 77
Author: yonran,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-23 11:54:50

Problema de seguridad usando express.bodyParser()

Mientras que todas las otras respuestas actualmente recomiendan usar el middleware express.bodyParser(), esto es en realidad un envoltorio alrededor del express.json(), express.urlencoded(), y express.multipart() middlewares ( http://expressjs.com/api.html#bodyParser ). El análisis de los cuerpos de solicitud de formulario se realiza mediante el middleware express.urlencoded() y es todo lo que necesita para exponer los datos de su formulario en el objeto req.body.

Debido a un problema de seguridad con cómo express.multipart()/connect.multipart() crea archivos temporales para todos los archivos cargados (y no se recogen basura), ahora es recomendado no usar el wrapper express.bodyParser() sino usar solo los middlewares que necesita.

Nota: connect.bodyParser() pronto se actualizará para incluir solo urlencoded y json cuando se lance Connect 3.0 (que Express extiende).


Así que en resumen, en lugar de ...

app.use(express.bodyParser());

...debe usar

app.use(express.urlencoded());
app.use(express.json());      // if needed

Y si / cuando necesita manejar formularios multiparte (cargas de archivos), utilice una biblioteca o middleware de terceros como multiparty, busboy, dicer, etc.

 73
Author: Sean Lynch,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-11-22 16:33:50

Esto lo hará si desea compilar la consulta publicada sin middleware:

app.post("/register/",function(req,res){
    var bodyStr = '';
    req.on("data",function(chunk){
        bodyStr += chunk.toString();
    });
    req.on("end",function(){
        res.send(bodyStr);
    });

});

Que enviará esto al navegador

email=emailval&password1=pass1val&password2=pass2val

Probablemente sea mejor usar middleware para no tener que escribir esto una y otra vez en cada ruta.

 27
Author: med116,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-05-01 00:35:09

Nota para los usuarios de Express 4:

Si intenta poner app.use(express.bodyParser()); en su aplicación, obtendrá el siguiente error cuando intente iniciar su servidor Express:

Error: La mayoría del middleware (como bodyParser) ya no está incluido con Express y debe instalarse por separado. Véase https://github.com/senchalabs/connect#middleware .

Tendrá que instalar el paquete body-parser por separado de npm , luego use algo como lo siguiente (ejemplo tomado de la página de GitHub):

var express    = require('express');
var bodyParser = require('body-parser');

var app = express();

app.use(bodyParser());

app.use(function (req, res, next) {
  console.log(req.body) // populated!
  next();
})
 22
Author: mplewis,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-05-10 20:59:41

Dada alguna forma:

<form action='/somepath' method='post'>
   <input type='text' name='name'></input>
</form>

Usando express

app.post('/somepath', function(req, res) {

    console.log(JSON.stringify(req.body));

    console.log('req.body.name', req.body['name']);
});

Salida:

{"name":"x","description":"x"}
req.param.name x
 18
Author: David,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-01-20 11:12:56
app.use(express.bodyParser());

Luego para la solicitud app.post puede obtener valores post a través de req.body.{post request variable}.

 14
Author: Chinthaka Senanayaka,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-08-17 15:20:11

Actualización para Express 4.4.1

Middleware de lo siguiente se elimina de Express.

  • bodyParser
  • json
  • urlencoded
  • multiparte

Cuando usa el middleware directamente como lo hizo en express 3.0. Obtendrá el siguiente error:

Error: Most middleware (like urlencoded) is no longer bundled with Express and 
must be installed separately.


Para utilizar esos middleware, ahora necesita hacer npm para cada middleware por separado.

Dado que bodyParser está marcado como obsoleto, por lo que recomiendo el siguiendo el camino usando json, urlencode y multipart parser como formidable, connect-multiparty. (El middleware Multipart también está obsoleto).

También recuerde, simplemente definiendo urlencode + json, los datos del formulario no serán analizados y req.el cuerpo será indefinido. Debe definir un controlador de middleware para la solicitud de varias partes.

var urlencode = require('urlencode');
var json = require('json-middleware');
var multipart = require('connect-multiparty');
var multipartMiddleware = multipart();

app.use(json);
app.use(urlencode);
app.use('/url/that/accepts/form-data', multipartMiddleware);
 13
Author: yeelan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-09-04 20:01:41

Motor:

import express from 'express';
import bodyParser from 'body-parser';

const app = express();
app.use(bodyParser.json()); // add a middleware (so that express can parse request.body's json)

app.post('/api/courses', (request, response) => {
  response.json(request.body);
});

Interfaz:

fetch("/api/courses", {
  method: 'POST',
  body: JSON.stringify({ hi: 'hello' }), // stringify JSON
  headers: new Headers({ "Content-Type": "application/json" }); // add headers
});
 11
Author: lakesare,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-02 22:26:19

Para Express 4.1 y superiores

Como la mayoría de las respuestas están usando para Expresar, bodyParser, conectar; donde multiparte está en desuso. Hay una forma segura de enviar objetos post multiparte fácilmente.

Multer se puede usar como reemplazo para connect.multipart ().

Para instalar el paquete

$ npm install multer

Cárgalo en tu app:

var multer = require('multer');

Y luego, agréguelo en la pila de middleware junto con el otro formulario que analiza el middleware.

app.use(express.json());
app.use(express.urlencoded());
app.use(multer({ dest: './uploads/' }));

Conectar.json () maneja application / json

Conectar.urlencoded () maneja application / x-www-form-urlencoded

Multer () maneja datos de múltiples partes/formularios

 7
Author: Lalit Umbarkar,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-08-30 10:37:32

Estaba buscando este problema exacto. Estaba siguiendo todos los consejos anteriores, pero req.body seguía devolviendo un objeto vacío {}. En mi caso, era algo tan simple como que el html fuera incorrecto.

En el html de tu formulario, asegúrate de usar el atributo 'name' en tus etiquetas de entrada, no solo 'id'. De lo contrario, nada se analiza.

<input id='foo' type='text' value='1'/>             // req = {}
<input id='foo' type='text' name='foo' value='1' /> // req = {foo:1}

Mi error idiota es tu beneficio.

 6
Author: cwingrav,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-11-18 14:20:48

No deberías usar la aplicación .use (express.bodyParser ()) . bodyParser es una unión de json + urlencoded + mulitpart. No debería usar esto porque multipart se eliminará en connect 3.0.

Para resolver eso, puedes hacer esto:

app.use(express.json());
app.use(express.urlencoded());

Es muy importante saber que aplicación.use (app.router) se debe utilizar después del json y urlencoded, de lo contrario no funciona!

 5
Author: HenioJR,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-02-18 13:52:34

La transmisión de solicitudes funcionó para mí

req.on('end', function() {
    var paramstring = postdata.split("&");
});

var postdata = "";
req.on('data', function(postdataChunk){
    postdata += postdataChunk;
});
 2
Author: zeah,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-04-29 18:01:27

Podría encontrar todos los parámetros usando el siguiente código para las solicitudes POST y GET.

 var express = require('express');
    var app = express();
    const util = require('util');  
    app.post('/', function (req, res) {
        console.log("Got a POST request for the homepage");
        res.send(util.inspect(req.query,false,null));
    })
 2
Author: ARUNBALAN NV,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-09-21 13:08:46
Post Parameters can be retrieved as follows-

app.post('/api/v1/test',Testfunction);
http.createServer(app).listen(port, function(){
console.log("Express server listening on port " + port)
});

function Testfunction(request,response,next)
{
   console.log(request.param("val1"));

   response.send('HI');
}
 0
Author: HamidKhan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-10-11 15:30:23

Use el paquete express-fileupload

var app = require('express')();
var http = require('http').Server(app);
const fileUpload = require('express-fileupload')

app.use(fileUpload());

app.post('/', function(req, res) {
var email = req.body.email;
res.send('<h1>Email :</h1> '+email);
});

http.listen(3000, function(){
  console.log('Running Port:3000');
});
 0
Author: Chirag,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-11-06 13:46:43
var express        =         require("express");
var bodyParser     =         require("body-parser");
var app            =         express();

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

app.get('/',function(req,res){
  res.sendfile("index.html");
});
app.post('/login',function(req,res){
  var user_name=req.body.user;
  var password=req.body.password;
  console.log("User name = "+user_name+", password is "+password);
  res.end("yes");
});
app.listen(3000,function(){
  console.log("Started on PORT 3000");
})
 0
Author: seme,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-01-19 23:27:08

Está utilizando 'req.consulta.post 'con método incorrecto' req.consulta.post' trabaja con "method=get' 'method = post' funciona con body-parser.

Solo prueba esto cambiando post para obtener

<form id="loginformA" action="userlogin" method="get">
<div>
    <label for="email">Email: </label>
    <input type="text" id="email" name="email"></input>
</div>
<input type="submit" value="Submit"></input>  
</form>

Y en express code use ' app.get '

 0
Author: sagar saini,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-03-07 05:25:46