Kann mir bitte jemand den empfohlenen (aktuellen) Weg sagen, um POSTed-Formulardaten im Express zu erhalten.
So viele Tutorials/Beiträge usw. sprechen über bodyParser, aber dies ist nicht mehr mit Express gebündelt, und andere Blogs usw. empfehlen die direkte Verwendung von urlencoded, aber jetzt ist dies auch nicht verfügbar.
Der Versuch, genaue Informationen zu diesen Frameworks oder Technologien zu finden, macht mir Kopfzerbrechen.
Übrigens interessiere ich mich für sehr einfache und kleine Daten

Mritunjay
Sie sollten installieren body-parser
durch npm-install
. Jetzt kommt es als separate Middleware.
Fügen Sie danach die folgende Zeile in Ihrer app.js hinzu
var bodyParser = require('body-parser');
app.use(bodyParser.json());
app.use(bodyParser.urlencoded());
// in latest body-parser use like below.
app.use(bodyParser.urlencoded({ extended: true }));
Es analysiert die post
Anfrage als object
. Sie werden Ihre Variablen eingeben req.body
.
In deiner post
Anfragebearbeiter.
app.post('/post',function(request,response){
console.log(request.body) //you will get your data in this as object.
})
Bearbeiten 1
Die obige Antwort war für die speziell gestellte Frage, nach der das OP suchte bodyParser
(veraltet), was nicht Teil von war express
mehr.
Da der Titel der Frage sehr allgemein gehalten ist und die Antwort nicht alle Aspekte von enthält form-data
werde ich die Antwort von @StLia als Bearbeitung einfügen.
Body-Parser Readme
Dies behandelt aufgrund ihrer komplexen und typischerweise großen Beschaffenheit keine mehrteiligen Körper. Für mehrteilige Körper könnten Sie an folgenden Modulen interessiert sein:

HubballiHuli
Sie können Gebrauch machen Express-beeindruckend Modul dazu. Installieren Sie „express-formidable“ mit dem folgenden Befehl
npm install express-formidable
Das einfache Beispiel ist wie folgt
const express = require('express');
const formidable = require('express-formidable');
var app = express();
app.use(formidable());
app.post('/upload', (req, res) => {
//req.fields contains non-file fields
//req.files contains files
res.send(JSON.stringify(req.fields));
});
Klicken Sie hier für weitere Beschreibung

StLia
Aus der README von Body-Parser:
Dies behandelt aufgrund ihrer komplexen und typischerweise großen Beschaffenheit keine mehrteiligen Körper.
Das obige wird mit arbeiten x-www-form-urlencoded
und json
aber es wird mit keinem funktionieren multipart
. form-data
ist auch multipart
mit der Überschrift multipart/form-data
.
Im Falle von form-data
wäre Ihre beste Lösung zu verwenden Express-beeindruckend.
Neben den Lösungen mit formidable
gibt es ein weiteres Modul, das ich seit 2019 in meinen aktuellen Projekten verwende. Das Modul Express-Formulardaten kann einfach in Ihrer Serverdatei deklariert werden wie:
const express = require('express');
const formData = require('express-form-data');
app.use(formData.parse());
app.post('/image-upload', (req, res) => {
console.log(req.files);
})
...
Beim Hochladen von Bildern zum Beispiel req.files
liefert alle relevanten Daten, die Sie für den Umgang mit den Dateien benötigen, wie Pfad, Größe, Dateiname usw.
Mir ist aufgefallen, dass die Antwort von @HubballiHuli darin bestand, ein Paket namens express-formidable zu verwenden. Sie müssen dieses unnötige Paket nicht verwenden, es stellt eine (kleine) Codedatei bereit. Stattdessen können Sie es selbst tun (jetzt wird die Abhängigkeit entfernt).
Hier ist die formidableMiddleware-Datei:
'use strict';
const formidable = require('formidable');
function parse(opts, events) {
return (req, res, next) => {
if (req.express_formidable && req.express_formidable.parsed) {
next();
return;
}
const form = new formidable.IncomingForm();
Object.assign(form, opts);
let manageOnError = false;
if (events) {
events.forEach((e) => {
manageOnError = manageOnError || e.event === 'error';
form.on(e.event, (...parameters) => { e.action(req, res, next, ...parameters); });
});
}
if (!manageOnError) {
form.on('error', (err) => {
next(err);
});
}
form.parse(req, (err, fields, files) => {
if (err) {
next(err);
return;
}
Object.assign(req, { fields, files, express_formidable: { parsed: true } });
next();
});
};
}
module.exports = parse;
exports.parse = parse;
Nun zur Verwendung:
const express = require('express');
const formidableMiddleware = require('./formidableMiddleware.js');
var app = express();
app.use(formidableMiddleware());
app.post('/upload', (req, res) => {
//req.fields contains non-file fields
//req.files contains files
res.send(JSON.stringify(req.fields));
});
Ich habe vor einiger Zeit einen Artikel über unnötige Pakete geschrieben und warum man sie nicht verwendet:
https://medium.com/@alexjamesdunlop/unnecessary-packages-b3623219d86
Express 4.16+ hat eine eigene Version des Body-Parsers implementiert, sodass Sie die Abhängigkeit nicht zu Ihrem Projekt hinzufügen müssen. Sie können es nativ in Express ausführen
app.use(express.json()); // Used to parse JSON bodies
app.use(express.urlencoded()); // Parse URL-encoded bodies using query-string library
// or
app.use(express.urlencoded({ extended: true })); // Parse URL-encoded bodies using qs library
Nicht veraltete Alternative zum Body-Parser in Express.js
Abfragezeichenfolge vs qs
10152700cookie-checkExprimieren Sie js-Formulardatenyes
Dies sollte nicht herabgestuft werden. Es gibt wirklich keine einfache Dokumentation zum Lesen eines einzelnen POST-Parameters. Die akzeptierte Lösung verwendet ein veraltetes Paket.
– Jeremy
3. September 2014 um 4:23 Uhr
Jeremy Ich denke, dass die akzeptierte Lösung kein veraltetes Paket ist. Das Paket, auf das sich Mritunjay bezieht, hat einen Bindestrich in seinem Namen und unterscheidet sich meines Erachtens von der angreifbaren “Bodyparser”-Middleware. Ich denke, es wird in einigen Blogposts darauf hingewiesen, die vor dem ursprünglichen “Bodyparser” warnen. Aus diesem Grund stimme ich zu, dass es nicht herabgestuft werden sollte (dh keinen Forschungsaufwand zeigt), weil ich ewig nach einer Lösung gesucht habe, aber das Problem ist, dass es so viele alte und verwirrende Informationen gibt, die mir den Kopf zerbrechen.
– Dave Pile
4. September 2014 um 1:11 Uhr
Danke für die Klarstellung; Ich wusste nicht, dass es einen Unterschied zwischen den Paketen body-parser und bodyParser gibt. Diese Subtilität ist einer der Gründe, warum diese Frage richtig ist.
– Jeremy
4. September 2014 um 14:18 Uhr