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

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:

  1. 安装依赖:
npm install node-fetch
# 若需要类型支持(针对node-fetch v2版本),安装类型声明包
npm install @types/node-fetch --save-dev
  1. 在代码中导入并复用原有逻辑:
import fetch from 'node-fetch';

let uri = await nft.tokenURI(tokenId);
let response = await fetch(uri);
let json = await response.json();

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 20:05:39