Node-express升级node-fetch@3.x后fetch.Headers不是构造函数怎么解决
错误原因
import("node-fetch")属于动态导入语法,返回值是Promise对象,并非直接返回node-fetch模块的导出内容,因此直接访问fetch.Headers必然不存在。- 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
相关产品推荐
相关产品推荐

