Wie kann ich problemlos auf Formulardaten in Express js zugreifen?

Lesezeit: 6 Minuten

Benutzer-Avatar von Dave Pile
Dave Pile

Ich habe eine POST-Anfrage mit einer sehr einfachen und kleinen Menge an Formulardaten. Wie kann ich am einfachsten darauf zugreifen?

Viele Tutorials/Beiträge usw. sprechen darüber bodyParser, ist aber nicht mehr im Lieferumfang von Express enthalten. Andere Orte (Blogs usw.) empfehlen die Verwendung urlencoded direkt, aber jetzt ist auch dies nicht verfügbar.

Der Versuch, genaue Informationen zu diesen Frameworks oder Technologien zu finden, geht mir auf die Nerven.

Kann mir bitte jemand den empfohlenen (aktuellen) Weg erklären, wie ich POST-Formulardaten in Express erhalten kann?

  • Dies sollte nicht abgelehnt 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

  • Jeremy Ich denke, dass die akzeptierte Lösung kein veraltetes Paket ist. Das Paket, auf das sich Mritunjay bezieht, hat einen Bindestrich im Namen und unterscheidet sich meiner Meinung nach von der anfälligen „Bodyparser“-Middleware. Ich denke, es wird in einigen Blogbeiträgen erwähnt, die vor dem ursprünglichen „Bodyparser“ warnen. Aus diesem Grund stimme ich zu, dass es nicht abgelehnt werden sollte (dh es zeigt keinen Forschungsaufwand), da ich lange nach einer Lösung gesucht habe, aber das Problem darin besteht, dass es so viele alte und verwirrende Informationen gibt, die mir den Kopf zerbrechen.

    – Dave Pile

    4. September 2014 um 1:11

  • Danke für die Klarstellung; Mir war nicht klar, 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

Benutzeravatar von Mritunjay
Mritunjay

Sie sollten installieren body-parser durch npm-install. Jetzt kommt es als separate Middleware.

Fügen Sie anschließend die folgende Zeile in Ihre app.js ein

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 erhalten Ihre Variablen req.body.

In deinem post Anforderungshandler.

app.post('/post',function(request,response){
   console.log(request.body) //you will get your data in this as object.
})

Bearbeiten 1

Die obige Antwort bezog sich auf die speziell gestellte Frage, nach der das OP gesucht hatte bodyParser(veraltet), was nicht Teil von war express mehr.

Da der Titel der Frage sehr allgemein gehalten ist und die Antwort nicht alle Aspekte umfasst form-dataich werde die Antwort von @StLia als Bearbeitung einfügen.

Body-Parser-Readme

Aufgrund ihrer Komplexität und typischerweise großen Beschaffenheit werden hierdurch keine mehrteiligen Körper behandelt. Bei mehrteiligen Körpern könnten Sie an folgenden Modulen interessiert sein:

  • Verwenden Sie jetzt in Express 4: app.use(bodyParser.urlencoded({ erweitert: true }));

    – Jeff

    7. April 2015 um 1:18

  • Sie müssen die erweiterte Option bereitstellen, da es in späteren Versionen des Body-Parsers keine Standardeinstellung gibt

    – Phil

    1. November 2018 um 15:37 Uhr


  • Ja, aber es funktioniert nicht damit FormData() die Dateien enthält. Die Antwort von @stlia ist gut.

    – Alexander Kim

    24. Dezember 2018 um 5:32 Uhr

  • In Express 4.16 ist der Body-Parser jetzt integriert. Sie KÖNNEN ihn verwenden app.use(express.urlencoded({ extended: true }));

    – Moritz

    1. Januar 2022 um 12:45 Uhr

  • Vielleicht können Sie die Antwort dahingehend bearbeiten, dass dieses Zeug ab Version 4.16+ mit Express gebündelt ist

    – sayandcode

    4. Dezember 2022 um 8:27 Uhr

Benutzeravatar von HubballiHuli
HubballiHuli

Sie können davon Gebrauch machen ausdrücklich 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 eine weitere Beschreibung

  • Hat bei mir auch funktioniert. Akzeptierte Antwort hat nicht funktioniert FormData() mit Dateien.

    – DileepNimantha

    26. April 2021 um 11:37 Uhr

  • Habe Express ausprobiert, beeindruckend. Ein Problem wurde festgestellt. Wenn wir den Wert eines Feldes als Zahl übergeben, konvertiert formiddable ihn in einen String.

    – Jinu Joseph Daniel

    16. August 2022 um 11:51 Uhr

StLias Benutzeravatar
StLia

Aus der README-Datei von Body-Parser:

Aufgrund ihrer Komplexität und typischerweise großen Beschaffenheit werden hierdurch keine mehrteiligen Körper behandelt.

Das Obige wird funktionieren x-www-form-urlencoded Und json aber es wird mit keinem funktionieren multipart. form-data ist auch multipart mit der Kopfzeile multipart/form-data.

Im Falle von form-dataIhre beste Lösung wäre die Verwendung ausdrücklich beeindruckend.

Benutzer-Avatar von rofrol
Rofrol

Wie in dieser StackOverflow-Antwort angegeben:

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

Siehe auch: query-string vs. qs

Neben den Lösungen mit formidablees gibt ein weiteres Modul, das ich seit 2019 in meinen letzten 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);
})

...

Wenn Sie beispielsweise Bilder hochladen, req.files stellt alle relevanten Daten bereit, die Sie für den Umgang mit den Dateien benötigen, wie Pfad, Größe, Dateiname usw.

Benutzeravatar von Alex Dunlop
Alex Dunlop

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 (und jetzt die Abhängigkeit entfernen).

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 verwenden sollte:
https://medium.com/@alexjamesdunlop/unnecessary-packages-b3623219d86

Benutzeravatar von Sayyid Iskandar Khan
Sayyid Iskandar Khan

Wenn du gerne möchtest Wenden Sie die formidableMiddleware nur auf eine API-Route und nicht global anso würden Sie den Wert übergeben.

Dies wäre nützlich, wenn Sie verschiedene Header mischen möchten, um sie an die API für andere APIs zu übergeben, für die Sie nicht möchten, dass die formidableMiddleware-API angewendet wird.

const express = require('express');
const formidable = require('express-formidable');

var app = express();

app.post('/mypath', formidableMiddleware(), (req, res) => {
  // rest of the code
})

  • Das hat bei mir funktioniert. In meinem Fall habe ich mit auf die Formulardatenfelder zugegriffen req.fields.

    – henrykodev

    18. Mai um 0:58

1454070cookie-checkWie kann ich problemlos auf Formulardaten in Express js zugreifen?

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

Privacy policy