908 Stimmen

Wie man auf POST-Formularfelder in Express zugreift

Hier ist mein einfaches Formular:

<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>

Hier ist mein Express.js /Node.js-Code:

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

Ich habe versucht sReq.query.email o sReq.query['email'] o sReq.params['email'] , usw. Keiner von ihnen funktioniert. Sie kommen alle zurück undefined .

Wenn ich zu einem Get-Aufruf wechsle, funktioniert es, also irgendeine Idee?

1393voto

Drew Noakes Punkte 282438

Die Dinge haben geändert wieder einmal anfangen Express 4.16.0 können Sie jetzt express.json() y express.urlencoded() genau wie in Express 3.0 .

Dies war verschiedene ab Express 4.0 bis 4.15 :

$ npm install --save body-parser

und dann:

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

Der Rest ist wie in Express 3.0 :

Zunächst müssen Sie eine Middleware hinzufügen, um die Postdaten des Körpers zu analysieren.

Fügen Sie eine oder beide der folgenden Codezeilen hinzu:

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

Verwenden Sie dann in Ihrem Handler die req.body Objekt:

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

Beachten Sie, dass die Verwendung von express.bodyParser() wird nicht empfohlen.

app.use(express.bodyParser());

...ist gleichbedeutend mit:

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

Sicherheitsbedenken bestehen bei express.multipart() Daher ist es besser, die Unterstützung für den/die von Ihnen benötigten Codierungstyp(en) ausdrücklich hinzuzufügen. Wenn Sie eine mehrteilige Kodierung benötigen (um z. B. das Hochladen von Dateien zu unterstützen), sollten Sie dies lesen .

107voto

Sean Lynch Punkte 5957

Sicherheitsbedenken bei Verwendung von express.bodyParser()

Während alle anderen Antworten derzeit die Verwendung des express.bodyParser() Middleware ist dies eigentlich ein Wrapper um die express.json() , express.urlencoded() y express.multipart() Middlewares ( http://expressjs.com/api.html#bodyParser ). Das Parsen von Formular-Anfragekörpern wird von der express.urlencoded() Middleware und ist alles, was Sie brauchen, um Ihre Formulardaten auf req.body Objekt.

Aufgrund einer Sicherheitsbedenken mit wie express.multipart() / connect.multipart() temporäre Dateien für alle hochgeladenen Dateien anlegt (und nicht in den Müll wandert), ist es nun empfohlen nicht zu verwenden express.bodyParser() Wrapper, sondern verwenden Sie stattdessen nur die Middlewares, die Sie benötigen.

Nota: connect.bodyParser() wird demnächst aktualisiert und enthält nur noch urlencoded y json wenn Connect 3.0 veröffentlicht wird (das Express erweitert).


Kurz gesagt, anstatt ...

app.use(express.bodyParser());

...sollten Sie

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

und wenn Sie mehrteilige Formulare (Datei-Uploads) verarbeiten müssen, verwenden Sie eine Bibliothek oder Middleware eines Drittanbieters wie Multiparty, Busboy, Dicer usw.

88voto

yonran Punkte 16833

Hinweis : Diese Antwort ist für Express 2. Siehe aquí für Express 3.

Wenn Sie connect/express verwenden, sollten Sie die bodyParser-Middleware : Es ist beschrieben in der Expressjs-Leitfaden .

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

Hier ist die ursprüngliche Version, die nur für die Verbindung gilt:

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

Sowohl der Querystring als auch der Body werden geparst mit Rails-ähnliche Parameterbehandlung ( qs ) und nicht die low-level querystring Bibliothek . Um wiederholte Parameter zu analysieren mit qs muss der Parameter mit Klammern versehen werden: name[]=val1&name[]=val2 . Er unterstützt auch verschachtelte Maps. Zusätzlich zum Parsen von HTML-Formularen kann der bodyParser auch JSON-Anfragen automatisch parsen.

Editar : Ich habe mich über express.js informiert und meine Antwort so geändert, dass sie für Express-Benutzer verständlicher ist.

40voto

med116 Punkte 1426

Dies reicht aus, wenn Sie die gestellte Abfrage ohne Middleware erstellen möchten:

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

});

Dadurch wird Folgendes an den Browser gesendet

email=emailval&password1=pass1val&password2=pass2val

Es ist wahrscheinlich besser, Middleware zu verwenden, damit Sie dies nicht in jeder Route neu schreiben müssen.

29voto

mplewis Punkte 454

Hinweis für Express 4-Benutzer:

Wenn Sie versuchen, die app.use(express.bodyParser()); in Ihre Anwendung einfügen, erhalten Sie die folgende Fehlermeldung, wenn Sie versuchen, Ihren Express-Server zu starten:

Fehler: Die meiste Middleware (wie bodyParser) ist nicht mehr mit Express gebündelt und muss separat installiert werden. Bitte siehe https://github.com/senchalabs/connect#middleware .

Sie müssen das Paket installieren body-parser separat von npm , dann verwenden Sie etwas wie das Folgende (Beispiel entnommen aus die GitHub-Seite ):

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

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X