require(‘node-fetch’) gibt ERR_REQUIRE_ESM

Lesezeit: 4 Minuten

Benutzeravatar von Alex Stroescu
Alex Stroescu

Ich benutze einfach

const fetch = require('node-fetch')

Und ich verstehe

Error [ERR_REQUIRE_ESM]: require() of ES Module C:\Users\Alex\Desktop\rollbot\node_modules\node-fetch\src\index.js from C:\Users\Alex\Desktop\rollbot\index.js not supported.
Instead change the require of C:\Users\Alex\Desktop\rollbot\node_modules\node-fetch\src\index.js in C:\Users\Alex\Desktop\rollbot\index.js to a 
dynamic import() which is available in all CommonJS modules.
{
  code: 'ERR_REQUIRE_ESM'
}

Alle meine anderen Pakete funktionieren, nur Node-Fetch erledigt dies. Was muss ich tun, um Node-Fetch zu verwenden?

Benutzeravatar von BrandConstantin
MarkeConstantin

Was ich herausgefunden habe ist, dass die neueste Version von node-fetch standardmäßig auf ES-Module umgestellt. Du kannst:

  1. Deinstallieren Sie die aktuelle Version von Node-Fetch mit npm uninstall node-fetch
  2. Installieren Sie die zweite Version: npm install node-fetch@2

Bei mir hat es funktioniert!

Benutzeravatar von Konstantin Dinev
Konstantin Dinev

Von dem node-fetch Paket-Readme:

node-fetch ist ein reines ESM-Modul – Sie können es nicht mit require importieren. Wir empfehlen Ihnen, bei Version 2 zu bleiben, die mit CommonJS erstellt wurde, es sei denn, Sie verwenden ESM selbst. Wir werden weiterhin kritische Fehlerbehebungen dafür veröffentlichen.

Wenn Sie wollen require es, dann downgraden Sie auf v2.

Die andere Möglichkeit, die Sie haben, ist die Verwendung von Async import('node-fetch').then(...)

  • Oder besser Axios verwenden, wirklich viel Verwirrung wegen ES, CommonJs und auch Typoskript-Konfigurationen.

    – Ankit Kumar

    24. Dezember 2021 um 20:40 Uhr

  • Installieren Sie die zweite Version: npm install node-fetch@2

    – Snack-Überlauf

    23. Februar 2022 um 1:02

  • Mit Garn sollte es sein yarn add node-fetch@2.

    – Darth-Coder

    9. März um 20:29

Benutzeravatar von Ed L
Ed L.

In meinem Fall fand ich es persönlich einfacher, stattdessen eine Anforderung („Cross-Fetch“) zu verwenden. Die Dokumentation ist hier: Crossfetch

Es kann sowohl in CommonJS- als auch in ES6-Modulen verwendet werden.

  • Ihre Antwort könnte durch zusätzliche unterstützende Informationen verbessert werden. Bitte bearbeiten Sie sie, um weitere Details wie Zitate oder Dokumentation hinzuzufügen, damit andere bestätigen können, dass Ihre Antwort richtig ist. Weitere Informationen zum Verfassen guter Antworten finden Sie im Hilfecenter.

    – Gemeinschaft
    Bot

    1. Okt. 2021 um 19:41 Uhr

  • Ich habe versucht, Node-Fetch mit Typoskript zu verwenden, und die Verwendung von Cross-Fetch funktionierte ohne Probleme.

    – Parik Tiwari

    29. November 2021 um 17:37 Uhr

  • Das ist die Antwort. Ich habe zu viel Zeit damit verschwendet, es zu machen node-fetch funktionieren (v2 hat keine Typoskripttypen, v3 funktioniert nur in ESM, was in TS in node.js noch nicht gut unterstützt wird, ugh …). cross-fetch funktioniert einfach.

    – Mariusz Pawelski

    24. Januar 2022 um 11:39 Uhr

  • Lesen Sie die Dokumente: Wie funktioniert Crossfetch? (…) Wenn Sie sich im Knoten befinden, wird Ihnen die Node-Fetch-Bibliothek angezeigt. Es verwendet Node-Fetch v2, daher sollten Sie Node-Fetch einfach herunterstufen, anstatt eine weitere unnötige Abhängigkeitsebene hinzuzufügen.

    – Rafael Tavares

    28. Januar 2022 um 16:23

  • Crossfetch funktioniert nur über httpS

    – M22

    21. Mai 2022 um 23:26 Uhr

NEUESTES UPDATE MAI 2022

Sie werden möglicherweise nicht benötigt node-fetch mehr.

In der neuesten Version von Node.js (18.0.0), globaler Abruf (experimentell) ist standardmäßig aktiviert.

const res = await fetch('https://nodejs.org/api/documentation.json');
if (res.ok) {
  const data = await res.json();
  console.log(data);
}

Durch diesen Zusatz werden folgende Globals verfügbar gemacht: fetch, FormData, Headers, Request, Response.

Sie können diese API mit deaktivieren --no-experimental-fetch
Befehlszeilenflag.

Sie können verwenden node-fetch@3 von CommonJS mit dynamischen Importen. Da fetch bereits eine asynchrone API ist, können Sie einen Wrapper wie folgt definieren:

fetch.js

exports.fetch = async function (url, init) {
    const {default: fetch} = await import("node-fetch");
    return await fetch(url, init);
};

Sie können den Wrapper dann wie folgt verwenden:

const fetch = require("./fetch");

Dieser Trick funktioniert in TypeScript nicht sofort, da TypeScript den dynamischen Import in einen regulären Require umwandelt. Um dies zu umgehen, fügen Sie einfach die Ebene hinzu fetch.js zu Ihrem Projekt hinzufügen und außerdem eine Typdeklaration hinzufügen:

fetch.d.ts

/**
 * @param { import("node-fetch").RequestInfo} url
 * @param {import("node-fetch").RequestInit} init
 * @returns {Promise<import("node-fetch").Response>}
 */
export function fetch(
    url: import("node-fetch").RequestInfo,
    init: import("node-fetch").RequestInit
): Promise<import("node-fetch").Response>;

Crossfetch ist eine nette Alternative, verpackt aber eine 2.x-Version von node-fetch Sie erhalten also nicht die neueste Version.

kirogasas Benutzeravatar
kirogasa

NodeJS unterstützt zwei verschiedene Modultypen:

  • das ursprüngliche CommonJS-Modul, das verwendet require() um andere Module zu laden
  • die neueren ECMAScript-Module (auch bekannt als ESM), die verwenden import um andere Module zu laden.

Wie erwähnt in node-fetch Änderungsprotokoll (28. August 2021):

Dieses Modul wurde in der Version in ein reines ESM-Paket umgewandelt 3.0.0-beta.10. node-fetch ist ein reines ESM-Modul – Sie können es nicht mit importieren require. Wir empfehlen Ihnen, hier zu bleiben v2 die mit CommonJS erstellt wird, es sei denn, Sie verwenden ESM selbst. Wir werden weiterhin kritische Fehlerbehebungen dafür veröffentlichen.

Alternativ können Sie auch async verwenden import() Funktion von CommonJS zum Laden node-fetch asynchron:

const fetch = (...args) => import('node-fetch').then(({default: fetch}) => fetch(...args));

Sie können also stattdessen diesen Einzeiler verwenden const fetch = require('node-fetch').

Oder anstatt zu versuchen zu laden node-fetchkönnen Sie das Modul installieren und laden node-fetch-commonjs stattdessen. Es handelt sich um einen CommonJS-Wrapper node-fetch Das sollte für Kompatibilität sorgen:

const fetch = require('node-fetch-commonjs')

Benutzeravatar von WhiteFire
Weißes Feuer

https://github.com/alex-kinokon/esm-hook hat bei mir gut funktioniert. Fordern Sie es auf, bevor Sie versuchen, Node-Fetch zu importieren. Entweder über –require oder oben in Ihrem Skript.

1453770cookie-checkrequire(‘node-fetch’) gibt ERR_REQUIRE_ESM

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

Privacy policy