调用metaplex.nfts().uploadMetadata()报Bundlr客户端非构造函数错误
问题根因
这个报错是Bundlr客户端版本和Metaplex JS SDK依赖版本不兼容导致的:高版本Bundlr客户端修改了模块导出规则,Webpack打包时无法正确识别其构造函数,就会抛出你看到的错误。
你提到findNftByMint接口能正常调用也符合这个逻辑——这个接口只做链上数据读取,完全不会调用Bundlr存储相关的代码,自然不会触发依赖冲突。
修复方案
按以下顺序尝试,优先用第一个方案,绝大多数场景下都能解决:
- 锁定Bundlr客户端到兼容版本
目前你用的Metaplex JS SDK版本兼容的Bundlr客户端版本是0.8.9,直接装最新版Bundlr必然会触发导出冲突。执行对应包管理工具的命令安装指定版本:
安装完成后删掉# npm用户 npm install @bundlr-network/client@0.8.9 # yarn用户 yarn add @bundlr-network/client@0.8.9node_modules文件夹、对应的锁文件(package-lock.json或yarn.lock),重新执行依赖安装命令,重启开发服务即可。 - 临时替换存储适配器做功能验证
如果锁版本后仍有打包异常,可以先用SDK内置的测试存储适配器跳过Bundlr配置,先把NFT元数据上传的逻辑跑通,代码修改如下:
注意这个适配器仅适合本地开发测试,不存储真实数据,上线主网必须换回正式存储服务。// 先从SDK引入mockStorage方法 import { mockStorage } from "@metaplex-foundation/js"; const metaplex = Metaplex.make(connection) .use(keypairIdentity(fromWallet)) // 替换掉原来的bundlrStorage配置 .use(mockStorage()) - 补充Webpack polyfill配置(前端框架场景适用)
如果是在React/Vue等前端项目中运行代码,Webpack5默认移除了Node.js核心模块的polyfill,也可能触发Bundlr客户端加载异常,以Create React App项目为例,可以通过craco修改webpack配置,补充如下规则:module.exports = { webpack: { configure: (config) => { config.resolve.fallback = { ...config.resolve.fallback, fs: false, path: false, crypto: false, }; return config; }, }, };
避坑提示
- 不要移除
keypairIdentity相关配置:上传元数据需要钱包签名权限,移除后报钱包未定义是正常逻辑,这个方向的排查是无效的 - 测试时确保你生成的随机测试钱包在devnet有足够的测试SOL,否则即使解决了构造函数报错,后续也会因为余额不足触发上传失败
内容的提问来源于stack exchange,提问作者Aneesha Kota
相关产品推荐
相关产品推荐

