Firebase云函数使用node-fetch部署报ERR_REQUIRE_ESM如何解决
问题原因
你遇到的错误是因为node-fetch从v3版本开始,仅支持ESM模块规范,不能通过CommonJS的require()语法引入,而你当前的Firebase Cloud Functions项目默认使用CommonJS规范,因此出现兼容报错。
解决方案
方案1:降级node-fetch到v2版本(最简便,无需修改其他代码)
v2版本的node-fetch仍然支持CommonJS规范,完全适配你当前的项目环境,操作步骤如下:
- 先卸载当前版本的node-fetch:
npm uninstall node-fetch - 安装v2版本的node-fetch:
npm install node-fetch@2 - 修正package.json中的依赖配置,你当前的
dependencies里node-fetch的值为file:node_modules/node-fetch是错误的本地路径引用,安装完v2版本后会自动更新为正常的版本号,例如:
"dependencies": { "firebase-admin": "^9.8.0", "firebase-functions": "^3.14.1", "node-fetch": "^2.6.12" }
修改完成后重新部署即可,原有代码无需任何调整。
方案2:使用动态import加载node-fetch(无需降级,无需修改项目模块规范)
如果你需要使用node-fetch v3的新特性,可以在不调整项目整体模块规范的前提下,用异步动态import语法引入:
修改你的云函数代码如下:
const functions = require("firebase-functions"); const admin = require('firebase-admin'); admin.initializeApp(); exports.postalCode = functions.https.onCall( async (data, context) => { // 动态引入node-fetch const fetch = (await import('node-fetch')).default; const URL = 'https://zipcloud.ibsnet.co.jp/api/search?zipcode=100-0002'; return fetch(URL).then(res => res.json()); });
方案3:将项目整体切换为ESM规范
如果你愿意调整项目整体的模块规范来适配ESM,可以按以下步骤操作:
- 在你的package.json中新增配置项
"type": "module":
{ "name": "functions", "type": "module", "description": "Cloud Functions for Firebase", // 其余原有配置保持不变 }
- 将所有
require()语法替换为ESM的import语法,修改后的代码如下:
import functions from "firebase-functions"; import admin from 'firebase-admin'; import fetch from 'node-fetch'; admin.initializeApp(); exports.postalCode = functions.https.onCall( (data, context) => { const URL = 'https://zipcloud.ibsnet.co.jp/api/search?zipcode=100-0002'; return fetch(URL).then(res => res.json()); });
内容的提问来源于stack exchange,提问作者Masaru Nagaya
相关产品推荐
相关产品推荐

