Heim  >  Artikel  >  Web-Frontend  >  Migration von Node-Fetch/Form-Daten zu den nativen APIs von Node.js

Migration von Node-Fetch/Form-Daten zu den nativen APIs von Node.js

王林
王林Original
2024-07-28 06:07:021132Durchsuche

Migrating node-fetch/form-data to Node.js native APIs

Mit der Veröffentlichung von Node v16.15.0 und v17.5.0 wurden die Fetch-API und FormData eingeführt. Zuvor wurden die Pakete node-fetch und form-data verwendet, um browserähnliche APIs in Node.js zu verwenden. Um Node-Fetch-/Formulardatenpakete zu den nativen APIs von Node.j zu migrieren, können einige Änderungen vorgenommen werden, indem Importanweisungen von Paketen von Drittanbietern entfernt werden. Bei der Verwendung von Node.js-Funktionen wie „File“ sind jedoch wichtige Überlegungen zu beachten System. In diesem Artikel wird die Migration von Node-Fetch-/Form-Data-Paketen zu den nativen Node.js-APIs beschrieben.

Überblick über Migration

 import fs from 'node:fs';
-import FormData from 'form-data';
-import fetch from 'node-fetch';

-const file = fs.createReadStream('secret.txt');
+const file = await fs.openAsBlob('secret.txt', { type: 'text/plain' });
 const form = new FormData();
-form.append('file', file);
+form.append('file', file, 'secret.txt');

 const response = await fetch('https://example.com/upload', {
   method: 'POST',
   body: form,
 });

Details

Inkompatibilität der Typen

Das form-data-Paket und Node.js FormData sind nicht kompatibel und können nicht direkt mit der Fetch-API übergeben werden. Wenn Sie form-data an die native Fetch-API übergeben, ist der Anforderungstext die Zeichenfolge [object FormData].

import FormData from 'form-data';

const form = new FormData();
await fetch('https://example.com/upload', {
  method: 'POST',
  body: form,
});

// [object FormData]

Das Formulardatenpaket akzeptiert fs.ReadStream in Node.js. Die native API akzeptiert einen browserkompatiblen Blob. Um einen Blob aus einer Datei zu erstellen, können wir fs.openAsBlob() verwenden, das in Node.js v19.8.0 hinzugefügt wurde. Wenn Sie fs.ReadStream an FormData der nativen API übergeben, lautet der Wert [object Object].

import fs from 'node:fs';

const file = fs.createReadStream('secret.txt');
const form = new FormData();
form.append('file', file);

// Content-Disposition: form-data; name="file"
// 
// [object Object]

Inkompatibilität des internen Verhaltens

Das Formulardatenpaket erhält den Dateinamen von fs.ReadStream und verwendet ihn als Dateinamensfeld (interne Implementierung). Es ermittelt außerdem den Dateityp anhand des Dateinamens und legt den Content-Type-Header fest (interne Implementierung).

Blob hat keinen Dateinamen, er muss manuell angegeben werden. Die FormData der nativen API sind standardmäßig application/octet-stream, wenn der Content-Type nicht angegeben ist. Wir können den Content-Type explizit aus dem Argument von fs.openAsBlob().
angeben

const file = await fs.openAsBlob('secret.txt');
const form = new FormData();
form.append('file', file);

// Content-Disposition: form-data; name="file"; filename="blob"
// Content-Type: application/octet-stream
const file = await fs.openAsBlob('secret.txt', { type: 'text/plain' });
const form = new FormData();
form.append('file', file, 'secret.txt');

// Content-Disposition: form-data; name="file"; filename="secret.txt"
// Content-Type: text/plain

Abschluss

Fetch API und FormData sind ab Node.js v21.0.0 zu Stability: 2 (Stable) geworden. fs.openAsBlob() ist immer noch Stabilität: 1 (experimentell) in der neuesten Version von Node.js (v22.5.1 vom 27. Juli 2024). Wir müssen vorsichtig sein, wenn wir alte Laufzeiten verwenden oder experimentelle APIs verwenden, die potenzielle Funktionsänderungen mit sich bringen.

Das obige ist der detaillierte Inhalt vonMigration von Node-Fetch/Form-Daten zu den nativen APIs von Node.js. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn