Hardhat TypeScript项目中如何无额外HTTP包正确使用fetch
问题解答
结论:在非浏览器环境的TypeScript项目(比如Hardhat测试依赖的Node.js环境)中,无法不导入额外HTTP包就直接正常使用fetch。
原因分析
- TypeScript编译阶段不报错,是因为
lib.dom.ts提供了fetch的类型声明,让编译器识别这个API,但这仅做类型校验,不代表运行时环境具备该API。 - Hardhat测试运行在Node.js环境下,Node.js在v18版本之前默认没有内置
fetch(v18及以上虽有实验性支持,但Hardhat场景下不推荐依赖该特性),因此会触发ReferenceError: fetch is not defined的运行时错误。
解决方案
方案1:使用Node.js内置模块(无需额外安装包)
借助Node.js原生的http/https模块实现请求,无需额外安装依赖,但写法相对繁琐:
import * as https from 'https'; import { promisify } from 'util'; const get = promisify(https.get); async function fetchMetadata(uri: string) { const response = await get(uri); let data = ''; for await (const chunk of response) { data += chunk; } return JSON.parse(data); } // 使用示例 let uri = await nft.tokenURI(tokenId); let json = await fetchMetadata(uri);
方案2:安装fetch兼容包(推荐)
最简便的方式是安装适配Node.js的fetch实现包,比如node-fetch或cross-fetch:
- 安装依赖:
npm install node-fetch # 若需要类型支持(针对node-fetch v2版本),安装类型声明包 npm install @types/node-fetch --save-dev
- 在代码中导入并复用原有逻辑:
import fetch from 'node-fetch'; let uri = await nft.tokenURI(tokenId); let response = await fetch(uri); let json = await response.json();
内容的提问来源于stack exchange,提问作者GGizmos
相关产品推荐
相关产品推荐

