使用HDWalletProviderFactory获取Provider遇TypeError错误求助
解决HDWalletProvider初始化时的"Expected input type is Uint8Array (got object)"错误
问题复现
开发前端应用并使用Jest测试时,调用HDWalletProviderFactory.getProvider(Chain.ethereum())获取Provider,抛出以下错误:
TypeError: Expected input type is Uint8Array (got object)
错误栈信息:
18 | } > 19 | return new HDWalletProvider({ | ^ 20 | mnemonic: { 21 | phrase: Env.get('OPERATION_MNEMONIC') 22 | }, at toBytes (node_modules/@noble/hashes/utils.js:89:15) at pbkdf2Init (node_modules/@noble/hashes/pbkdf2.js:17:45) at pbkdf2 (node_modules/@noble/hashes/pbkdf2.js:42:44) at mnemonicToSeedSync (node_modules/@scure/bip39/index.js:140:32) at HDWalletProvider.checkBIP39Mnemonic (node_modules/@truffle/hdwallet-provider/src/index.ts:329:25) at new HDWalletProvider (node_modules/@truffle/hdwallet-provider/src/index.ts:109:12) at Function.getProvider (tests/data/reusable_classes/hd_wallet_provider_factory.ts:20:23) at AuthorizationInitializer.getProvider (tests/data/reusable_classes/authorization_token.ts:22:47) at new AuthorizationInitializer (tests/data/reusable_classes/authorization_token.ts:15:16)
对应的HDWalletProviderFactory代码:
export default class HDWalletProviderFactory { public static getProvider(chain:Chain): HDWalletProvider { return new HDWalletProvider({ mnemonic: { phrase: Env.get('OPERATION_MNEMONIC') }, providerOrUrl: Env.get('ETHEREUM_HDWALLET_PROVIDER_URL') }) } }
错误根源分析
从错误栈可追踪到:@scure/bip39的mnemonicToSeedSync方法在转换助记词为字节流时失败,预期输入是Uint8Array,但实际传入了对象。本质问题是Env.get('OPERATION_MNEMONIC')返回的不是字符串类型的助记词,而是一个异常对象。
可能的触发原因:
- 环境变量
OPERATION_MNEMONIC未正确加载,Env.get返回默认空对象或错误格式值 Env工具类的get方法在获取不到值时,未返回字符串而是返回对象(如包含错误信息的对象)- 环境变量值被意外序列化为JSON对象,而非原始字符串格式的助记词
解决方案
- 验证环境变量返回值
在创建HDWalletProvider前,先打印Env.get('OPERATION_MNEMONIC')的类型和值,确认是否为字符串:
public static getProvider(chain:Chain): HDWalletProvider { const mnemonicPhrase = Env.get('OPERATION_MNEMONIC'); console.log(typeof mnemonicPhrase, mnemonicPhrase); // 检查类型与实际值 return new HDWalletProvider({ mnemonic: { phrase: mnemonicPhrase }, providerOrUrl: Env.get('ETHEREUM_HDWALLET_PROVIDER_URL') }) }
如果输出类型为object而非string,说明Env.get的返回值不符合预期。
- 修复环境变量加载逻辑
- 确保测试环境中正确设置
OPERATION_MNEMONIC,值为纯字符串格式的助记词 - 检查
Env工具类实现,确保获取不到环境变量时返回空字符串或抛出错误,而非返回对象 - 若通过JSON文件加载环境变量,确认助记词未被误写为对象格式(正确格式应为
"OPERATION_MNEMONIC": "xxx xxx xxx...",而非嵌套对象)
- 临时强制类型转换(仅作为应急方案)
若确认环境变量值正确但Env.get返回包装对象,可强制转换为字符串:
phrase: String(Env.get('OPERATION_MNEMONIC')).trim()
注意:此方案仅为临时 workaround,优先修复Env工具类的返回值类型问题。
- 检查Jest环境变量配置
确保Jest测试中环境变量被正确注入:比如在jest.config.js中通过setupFiles加载环境变量,或使用dotenv包确保测试时能读取到.env文件中的值。
内容的提问来源于stack exchange,提问作者newbie
相关产品推荐
相关产品推荐

