So greifen Sie auf POST-Formularfelder zu

Lesezeit: 8 Minuten

So greifen Sie auf POST Formularfelder zu
murvinlai

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 es versucht sReq.query.email oder sReq.query['email'] oder sReq.params['email']usw. Keiner von ihnen funktioniert. Sie alle kehren zurück undefined.

Wenn ich auf Get Call umstelle, funktioniert es, also .. eine Idee?

  • SICHERHEIT: jeder mit bodyParser() Aus den Antworten hier sollte auch die Antwort von @ SeanLynch unten gelesen werden

    – FelipeAls

    24. November 2013 um 20:06 Uhr


So greifen Sie auf POST Formularfelder zu
Zeichnete Noakes

Dinge haben geändert noch einmal am Start Express 4.16.0können Sie jetzt verwenden express.json() und express.urlencoded() genauso wie drin Express 3.0.

Das war unterschiedlich beginnend 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:

Zuerst müssen Sie etwas Middleware hinzufügen, um die Post-Daten 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() ist nicht zu empfehlen.

app.use(express.bodyParser());

…ist äquivalent zu:

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

Sicherheitsbedenken bestehen bei express.multipart(), und daher ist es besser, die Unterstützung für die spezifischen Codierungstypen, die Sie benötigen, explizit hinzuzufügen. Wenn Sie eine mehrteilige Codierung benötigen (um beispielsweise das Hochladen von Dateien zu unterstützen), sollten Sie dies tun lesen Sie dies.

  • Wenn diese Antwort nicht richtig funktioniert, stellen Sie sicher, dass Sie die haben content-type Header-Set, zum Beispiel: curl -d '{"good_food":["pizza"]}' -H 'content-type:application/json' "http://www.example.com/your_endpoint"

    – SooDesuNe

    16. September 2012 um 23:21 Uhr


  • Was ist der Unterschied zwischen dem Posten eines Formulars mit Name/Wert-Paaren und dem Posten eines JSON-Texts? Erscheinen sie beide in req.body?

    – Chovy

    23. September 2012 um 6:32 Uhr

  • @chovy Ja, das tun sie. bodyParser abstrahiert JSON-, URL-codierte und mehrteilige Daten in die req.body Objekt.

    – Kristjan

    10. Januar 2013 um 6:46 Uhr

  • Dieser Code hat mir Fehler verursacht, da Middleware nicht mehr mit Express gebündelt ist; Sie müssen Body-Parser verwenden: github.com/senchalabs/connect#middleware

    – Araneen

    13. Juni 2014 um 14:00 Uhr

  • Zum Lesen von json mit Express 4 ist nur die app.use(require('body-parser').json()) Leitung reicht. Und dann können Sie die JSON-Daten aus dem Body-Objekt Ihrer Anfrage lesen, dh req.bodyinnerhalb einer Routendefinition.

    – Martin Carl

    15. November 2014 um 21:58 Uhr


1646646911 706 So greifen Sie auf POST Formularfelder zu
Sean Lynchen

Sicherheitsbedenken bei Verwendung von express.bodyParser()

Während alle anderen Antworten derzeit die Verwendung von empfehlen express.bodyParser() Middleware, das ist eigentlich ein Wrapper um die express.json(), express.urlencoded()und express.multipart() Middleware (http://expressjs.com/api.html#bodyParser). Das Parsen von Formularanforderungskörpern erfolgt durch die express.urlencoded() Middleware und ist alles, was Sie brauchen, um Ihre Formulardaten bereitzustellen req.body Objekt.

Aufgrund eines Sicherheitsbedenken mit wie express.multipart()/connect.multipart() Erstellt temporäre Dateien für alle hochgeladenen Dateien (und werden nicht müllgesammelt), ist es jetzt empfohlen nicht zu verwenden express.bodyParser() Wrapper, sondern verwenden Sie stattdessen nur die benötigte Middleware.

Notiz: connect.bodyParser() wird in Kürze aktualisiert, um nur noch einzuschließen urlencoded und json wenn Connect 3.0 veröffentlicht wird (das Express erweitert).


Also kurz gesagt, statt …

app.use(express.bodyParser());

…du solltest benutzen

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

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

  • Unter der Frage wurde ein Kommentar hinzugefügt, damit mehr Menschen Ihre Bedenken und Ratschläge sehen. Würden andere Lösungen detailliert in Blogbeitrag von Andrew Kelley Ihrer Meinung nach (noch) relevant? (Ich frage nur nach anderen, meine Bedürfnisse sind rein interne Tools ^^)

    – FelipeAls

    24. November 2013 um 20:14 Uhr

  • @FelipeAls – Ja, und ich wollte auch auf Andrews Beitrag verweisen. Jeder dieser Vorschläge (unter Berücksichtigung der jeweiligen Nachteile) ist relevant.

    – Sean Lynchen

    26. November 2013 um 1:58 Uhr

  • Auch, sobald Connect 3.0 ohne Einbeziehung veröffentlicht wird multipart() im Rahmen bodyParser(), bodyParser() wird wieder “sicher”, aber Sie müssen die mehrteilige Unterstützung explizit aktivieren, indem Sie eine Bibliothek eines Drittanbieters verwenden.

    – Sean Lynchen

    26. November 2013 um 1:59 Uhr

1646646911 50 So greifen Sie auf POST Formularfelder zu
Yonran

Notiz: Diese Antwort ist für Express 2. Siehe hier für Express 3.

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

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

Hier ist die ursprüngliche Nur-Connect-Version:

// 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 die Abfragezeichenfolge als auch der Textkörper werden mit analysiert Parameterbehandlung im Rails-Stil (qs) eher als das niedriges Niveau querystring Bücherei. Um wiederholte Parameter mit zu parsen qsmuss der Parameter Klammern haben: name[]=val1&name[]=val2. Es unterstützt auch verschachtelte Karten. Zusätzlich zum Parsen von HTML-Formularübermittlungen kann der bodyParser JSON-Anforderungen automatisch parsen.

Bearbeiten: Ich habe express.js gelesen und meine Antwort so geändert, dass sie für Benutzer von Express natürlicher ist.

  • Hm okay. Ich versuche den bodyParser(). Das Dokument sagt, ich kann es von req.query() bekommen, aber ich habe nichts. das ist sehr seltsam. Ich habe kein Problem mit Get tho.

    – murvinlai

    19. April 2011 um 5:19 Uhr

  • Nein, req.query ist NUR die GET-Parameter. Sie erhalten die POST-Daten über req.body. Die Funktion req.params() enthält beide.

    – Yonran

    19. April 2011 um 6:23 Uhr

  • Ein verirrter Klick hat diese Antwort versehentlich abgelehnt, ohne dass ich es bemerkt habe! Jetzt lässt mich StackOverflow nicht ändern. Esp. frustrierend, da dies hilfreich war … Ich habe eine weitere Ihrer guten Antworten positiv bewertet, nach der ich nicht explizit gesucht habe, um dies auszugleichen. 🙂

    – HostileFork sagt, vertraue SE nicht

    11. April 2012 um 20:58 Uhr

So greifen Sie auf POST Formularfelder zu
med116

Dies wird es tun, wenn Sie die gepostete 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 dies an den Browser gesendet

email=emailval&password1=pass1val&password2=pass2val

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

1646646914 52 So greifen Sie auf POST Formularfelder zu
mplewis

Hinweis für Express 4-Benutzer:

Wenn Sie versuchen und setzen app.use(express.bodyParser()); in Ihrer App erhalten Sie die folgende Fehlermeldung, wenn Sie versuchen, Ihren Express-Server zu starten:

Fehler: Die meiste Middleware (wie bodyParser) ist nicht mehr im Lieferumfang von Express enthalten und muss separat installiert werden. Bitte sehen https://github.com/senchalabs/connect#middleware.

Sie müssen das Paket installieren body-parser separat von npmdann verwenden Sie etwas wie das Folgende (Beispiel 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();
})

  • Vielen Dank für diese Informationen. Ich habe mir die Haare ausgerissen, als ich versuchte, mit der neuen Art der Verwendung von bodyParser umzugehen! Das war ein großer Durchbruch – sehr zu schätzen

    – Tommi

    27. Mai 2014 um 11:27 Uhr

  • heplp: body-parser veraltet bodyParser: individuelle json/urlencodierte Middlewares verwenden

    – Mohammad Faizan Khan

    29. Oktober 2014 um 6:12 Uhr

1646646915 387 So greifen Sie auf POST Formularfelder zu
David

In irgendeiner Form gegeben:

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

Express verwenden

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

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

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

Ausgabe:

{"name":"x","description":"x"}
req.param.name x

  • Vielen Dank für diese Informationen. Ich habe mir die Haare ausgerissen, als ich versuchte, mit der neuen Art der Verwendung von bodyParser umzugehen! Das war ein großer Durchbruch – sehr zu schätzen

    – Tommi

    27. Mai 2014 um 11:27 Uhr

  • heplp: body-parser veraltet bodyParser: individuelle json/urlencodierte Middlewares verwenden

    – Mohammad Faizan Khan

    29. Oktober 2014 um 6:12 Uhr

Backend:

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

Vorderes Ende:

fetch("/api/courses", {
  method: 'POST',
  body: JSON.stringify({ hi: 'hello' }), // convert Js object to a string
  headers: new Headers({ "Content-Type": "application/json" }) // add headers
});

  • ah ya – denke immer standardmäßig in JSON, wenn in Javascript.

    – WestCoastProjects

    7. August 2020 um 11:19 Uhr

964970cookie-checkSo greifen Sie auf POST-Formularfelder zu

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy