Exprimieren Sie js-Formulardaten

Lesezeit: 5 Minuten

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

  • 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

Benutzer-Avatar
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-datawerde 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:

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

    – Jeff

    7. April 2015 um 1:18 Uhr

  • Sie müssen die erweiterte Option angeben, da es in späteren Versionen von body-parser keine Standardeinstellung gibt

    – Phil

    1. November 2018 um 15:37 Uhr


  • Ja, aber es wird nicht mit funktionieren 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 jetzt ein Body-Parser eingebaut. Sie KÖNNEN es verwenden app.use(express.urlencoded({ extended: true }));

    – Moritz

    1. Januar um 12:45 Uhr

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

  • @llamerr Ich bin froh, dass ich helfen konnte.

    – HubballiHuli

    19. April 2018 um 6:16 Uhr

  • ich auch, das hat bei mir funktioniert, aber die akzeptierte Antwort nicht.

    – Khalid Taha

    21. Juli 2018 um 0:20 Uhr

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

    – DileepNimantha

    26. April 2021 um 11:37 Uhr

Benutzer-Avatar
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-datawäre Ihre beste Lösung zu verwenden Express-beeindruckend.

Neben den Lösungen mit formidablegibt 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

1015270cookie-checkExprimieren Sie js-Formulardaten

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

Privacy policy