it-swarm.com.de

Wie abrufen? POST Abfrageparameter?

Hier ist meine einfache Form:

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

Wenn ich zu einem Get-Anruf wechsle, funktioniert es, also ... eine Idee?

694
murvinlai

Die Dinge haben geändert wieder angefangen, beginnend mit Express 4.16.0. Sie können nun express.json() und express.urlencoded() wie in Express 3.0 verwenden.

Dies war anders 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:

Zuerst müssen Sie etwas 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 das Objekt req.body :

// 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() nicht empfohlen wird.

app.use(express.bodyParser());

...ist äquivalent zu:

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

Es gibt Sicherheitsbedenken in Bezug auf express.multipart(). Daher ist es besser, die Unterstützung für die von Ihnen benötigten spezifischen Codierungstypen explizit hinzuzufügen. Wenn Sie eine mehrteilige Kodierung benötigen (um beispielsweise das Hochladen von Dateien zu unterstützen), sollten Sie lesen Sie dies .

1122
Drew Noakes

Note: Diese Antwort gilt für Express 2. Siehe hier für Express 3.

Wenn Sie connect/express verwenden, sollten Sie die bodyParser-Middleware verwenden: Sie wird im Expressjs-Handbuch beschrieben.

// 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 Connect-Only-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 Querzeichenfolge als auch der Rumpf werden mit Rails-Style-Parameterbehandlung (qs) und nicht mit der low-level querystring-Bibliothek analysiert. Um wiederholte Parameter mit qs zu parsen, muss der Parameter Klammern haben: name[]=val1&name[]=val2. Es unterstützt auch verschachtelte Karten. Neben dem Parsen von HTML-Formularsendungen kann der bodyParser JSON-Anforderungen automatisch parsen.

Edit: Ich habe express.js gelesen und meine Antwort so modifiziert, dass sie für Benutzer von Express natürlicher ist.

80
yonran

Sicherheitsbedenken mit express.bodyParser ()

Während alle anderen Antworten derzeit die Verwendung der express.bodyParser()-Middleware empfehlen, handelt es sich hierbei tatsächlich um einen Wrapper um die Middleware express.json(), express.urlencoded() und express.multipart() ( http://expressjs.com/api.html#bodyParser ). Das Parsen von Formularanforderungskörpern wird von der express.urlencoded()-Middleware ausgeführt und ist alles, was Sie benötigen, um Ihre Formulardaten für das req.body-Objekt verfügbar zu machen.

Aufgrund eines Sicherheitsproblems mit dem Erstellen von express.multipart()/_connect.multipart() für alle hochgeladenen Dateien (und es wird kein Müll gesammelt), ist es jetzt empfohlen, den Wrapper express.bodyParser() jedoch nicht zu verwenden Verwenden Sie stattdessen nur die Middlewares, die Sie benötigen.

Hinweis: connect.bodyParser() wird in Kürze aktualisiert und enthält nur urlencoded und json, wenn Connect 3.0 freigegeben wird (was durch Express erweitert wird).


Also kurz gesagt, anstatt ...

app.use(express.bodyParser());

...du solltest benutzen

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

wenn Sie mit mehrteiligen Formularen (Dateiuploads) arbeiten müssen, verwenden Sie eine Bibliothek oder Middleware von Drittanbietern, wie z. B. Multiparty, Busboy, Dicer usw.

79
Sean Lynch

Dies geschieht, wenn Sie die veröffentlichte 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);
    });

});

Das wird dies an den Browser senden

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.

29
med116

Hinweis für Benutzer von Express 4:

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

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

Sie müssen das Paket body-parser separat von von npm installieren und dann Folgendes verwenden (Beispiel aus der 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();
})
23
mplewis

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
18
David
app.use(express.bodyParser());

Für app.post-Anfrage können Sie dann Postwerte über req.body.{post request variable} abrufen.

14

Update für Express 4.4.1

Die folgende Middleware wird aus Express entfernt.

  • bodyParser
  • json
  • urlencodiert
  • mehrteilig

Wenn Sie die Middleware direkt wie in Express 3.0 verwenden. Sie erhalten folgende Fehlermeldung:

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


Um diese Middleware nutzen zu können, müssen Sie jetzt npm für jede Middleware separat ausführen.

Da bodyParser als veraltet markiert ist, empfehle ich die Verwendung von json, urlencode und multipart-parser wie formidable, connect-multiparty. (Multipart-Middleware ist ebenfalls veraltet).

Denken Sie auch daran, dass Sie bei der Definition von urlencode + json die Formulardaten nicht analysieren und der erforderliche Körper undefiniert ist. Sie müssen eine Middleware definieren, die die mehrteilige Anforderung behandelt.

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);
14
yeelan

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' }), // stringify JSON
  headers: new Headers({ "Content-Type": "application/json" }); // add headers
});
12
lakesare

Ich habe genau nach diesem Problem gesucht. Ich folgte allen oben genannten Ratschlägen, aber req.body gab immer noch ein leeres Objekt zurück {}. In meinem Fall war es etwas so einfaches wie das falsche HTML. 

Stellen Sie sicher, dass Sie in der HTML-Datei Ihres Formulars das 'name'-Attribut in Ihren Eingabe-Tags verwenden, nicht nur 'id'. Ansonsten wird nichts analysiert.

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

Mein Idiotfehler ist dein Vorteil.

7
cwingrav

Für Express 4.1 und höher

Da die meisten Antworten für Express, BodyParser, Connect verwendet werden; wo mehrteilig veraltet ist. Es gibt eine sichere Methode, um mehrteilige Objekte einfach zu versenden.

Multer kann als Ersatz für connect.multipart () verwendet werden. 

So installieren Sie das Paket

$ npm install multer

Laden Sie es in Ihre App:

var multer = require('multer');

Fügen Sie es dann zusammen mit der anderen Middleware zum Parsen von Formularen in den Middleware-Stapel ein.

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

connect.json () behandelt die Anwendung/json

connect.urlencoded () behandelt die Anwendung/x-www-form-urlencoded

multer () behandelt Multipart/Formulardaten

7
Lalit Umbarkar

Sie sollten app.use (express.bodyParser ()) nicht verwenden. BodyParser ist eine Vereinigung von json + urlencoded + mulitpart. Sie sollten dies nicht verwenden, da Multipart in Connect 3.0 entfernt wird.

Um dies zu beheben, können Sie Folgendes tun:

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

Es ist sehr wichtig zu wissen, dass app.use (app.router) nach json und urlencoded verwendet werden sollte, sonst funktioniert es nicht!

5
HenioJR

Request Streaming hat für mich funktioniert

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

var postdata = "";
req.on('data', function(postdataChunk){
    postdata += postdataChunk;
});
2
zeah

Ich könnte alle Parameter finden, indem ich den folgenden Code für beidePOSTundGET-Anfragen verwende. 

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

verwenden Sie das Paket 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
Chirag
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
HamidKhan

Sie verwenden 'req.query.post' mit der falschen Methode. 'Req.query.post' arbeitet mit 'method = get' 'Method = post' arbeitet mit Body-Parser.

Versuchen Sie dies einfach, indem Sie den Post ändern, um zu erhalten

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

Und im Expresscode verwende 'app.get'

0
sagar saini
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
seme