You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Node-express升级node-fetch@3.x后fetch.Headers不是构造函数怎么解决

错误原因

  1. import("node-fetch") 属于动态导入语法,返回值是Promise对象,并非直接返回node-fetch模块的导出内容,因此直接访问fetch.Headers必然不存在。
  2. node-fetch v3 仅支持ES Module规范,若继续使用CommonJS的require语法,需要调整导入逻辑。

解决方案

方案1:切换项目为ES Module规范(推荐适配v3版本)

  • 首先在项目根目录的package.json中添加配置项:"type": "module"
  • 将所有require导入改为ES Module的import语法,完整修改后的代码如下:
import express from 'express';
import ejs from 'ejs';
import fetch, { Headers } from 'node-fetch';
import { fileURLToPath } from 'url';
import path from 'path';

// ES Module中需手动定义__dirname
const __filename = fileURLToPath(import.meta.url);
const __dirname = path.dirname(__filename);

const port = 8080;
const app = express();

app.use(express.json());
app.use(express.static(__dirname + "/public"));

app.get('/', (req, res) => {
    let myHeaders = new Headers();
    // 此处替换为实际请求地址
    const uri = "你的实际请求接口地址";
    const options = {
        method: 'GET',
        headers: myHeaders
    };
    fetch(uri, options)
        .then(response => response.text())
        .then(result => {
            console.log(result);
            const list = JSON.parse(result);
            res.render(__dirname + '/index.html');
        })
        .catch(error => console.log('error', error));
    
})

app.listen(port, () =>{
    console.log("Listening at 8080");
})

方案2:保留CommonJS规范,正确处理动态导入

不想修改项目模块类型的话,将导入和调用逻辑放到异步流程中即可:

const express = require('express');
const port = 8080;
const app = express();
const ejs = require('ejs');

app.use(express.json());
app.use(express.static(__dirname + "/public"));

// 路由回调添加async关键字支持await
app.get('/', async (req, res) => {
    // 等待动态导入完成,拿到模块内容
    const { default: fetch, Headers } = await import('node-fetch');
    let myHeaders = new Headers();
    // 此处替换为实际请求地址
    const uri = "你的实际请求接口地址";
    const options = {
        method: 'GET',
        headers: myHeaders
    };
    try {
        const response = await fetch(uri, options);
        const result = await response.text();
        console.log(result);
        const list = JSON.parse(result);
        res.render(__dirname + '/index.html');
    } catch (error) {
        console.log('error', error);
    }
})

app.listen(port, () =>{
    console.log("Listening at 8080");
})

方案3:降级到node-fetch 2.x版本(最省改动)

node-fetch 2.x版本依然支持CommonJS规范,无需修改现有代码逻辑,直接执行安装命令即可:
npm install node-fetch@2
安装完成后原来的const fetch = require("node-fetch")写法可直接正常运行。

其他注意事项

你原有代码中var uri = uri属于无效赋值,运行时会报uri未定义错误,记得替换为实际的请求地址。


内容的提问来源于stack exchange,提问作者Nizar Kadri

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.04 01:18:03