Pregunta ¿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 Express.js/Node.js code:

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

Lo 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 a Get, funciona, así que ... ¿alguna idea?


632
2018-04-19 00:38


origen


Respuestas:


Las cosas tienen cambiado una vez más comenzando Express 4.16.0, ahora puedes usar express.json() y express.urlencoded() justo como en Express 3.0.

Esto era diferente comenzando Express 4.0 a 4.15:

$ npm install --save body-parser

y entonces:

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 de publicación del cuerpo.

Agregue una o ambas de las siguientes líneas 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 es recomendado.

app.use(express.bodyParser());

...es equivalente a:

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

Problemas de seguridad existen express.multipart(), por lo que es mejor agregar de forma explícita compatibilidad con los tipos de codificación específicos que necesita. Si necesita una codificación de varias partes (para admitir la carga de archivos, por ejemplo), entonces debería Lee esto.


1042
2017-08-17 15:30



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

Si está utilizando connect / express, debe usar middleware bodyParser: Se describe en el 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 la querystring como el cuerpo se analizan usando Manejo de parámetros estilo Rails (qs) en lugar de la nivel bajo querystring biblioteca. Para analizar parámetros repetidos con qs, el parámetro necesita tener paréntesis: name[]=val1&name[]=val2. También es compatible con mapas anidados. Además de analizar envíos de formularios HTML, bodyParser puede analizar solicitudes JSON de forma automática.

Editar: Leí en express.js y modifiqué mi respuesta para ser más natural para los usuarios de Express.


75
2018-04-19 02:21



Preocupación de seguridad al utilizar express.bodyParser ()

Mientras que todas las otras respuestas actualmente recomiendan usar el express.bodyParser() middleware, 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 por el express.urlencoded() middleware y es todo lo que necesita para exponer los datos de su formulario en req.body objeto.

Debido a un preocupación de seguridad con cuanto express.multipart()/connect.multipart() crea archivos temporales para todos los archivos cargados (y no son basura), ahora es recomendado no usar el express.bodyParser() envoltorio pero en su lugar use solo los middleware que necesita.

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


En resumen, en lugar de ...

app.use(express.bodyParser());

...Deberías usar

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

y si / cuando necesita manejar formularios de varias partes (archivos cargados), use una biblioteca de terceros o middleware como multiparty, busboy, dicer, etc.


73
2017-11-21 22:00



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);
    });

});

Eso enviará esto al navegador

email=emailval&password1=pass1val&password2=pass2val

Sin embargo, es mejor usar middleware, por lo que no es necesario que escriba esto una y otra vez en cada ruta.


27
2017-07-22 02:19



Nota para usuarios de Express 4:

Si tratas y pones app.use(express.bodyParser()); en su aplicación, recibirá el siguiente error cuando intente iniciar su servidor Express:

Error: la mayoría del middleware (como bodyParser) ya no se incluye con Express y debe instalarse por separado. Por favor mira https://github.com/senchalabs/connect#middleware.

Tendrás 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
2018-05-10 20:52



Dada alguna forma:

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

Usando expreso

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
2018-01-20 11:12



app.use(express.bodyParser());

Entonces para app.post solicitud puede obtener valores de publicación a través de req.body.{post request variable}.


14
2018-04-09 19:18