调用TronWeb.estimateEnergy报错Cannot set properties of null如何解决?
问题描述
我有一个基于NestJS+TypeScript的应用,正在对接TronWeb并尝试计算预估Gas(能耗),使用的代码如下:
const estimatedEnergy = await tronWeb.transactionBuilder.estimateEnergy( USDTContractAddress, 'balanceOf(address)', null, abi, address, );
执行该函数时返回如下错误:
[Nest] 26120 - 26/03/2024, 4:23:09 pm ERROR [ExceptionsHandler] Cannot set properties of null (setting 'estimateEnergy') TypeError: Cannot set properties of null (setting 'estimateEnergy') at e.value (C:\app\node_modules\tronweb\dist\webpack:\tronweb\src\lib\transactionBuilder.js:1277:19) at Object.getEstimateGasFee (C:\app\src\tronweb\index.ts:108:62) at estimateGasFee (C:\app\src\controller.ts:48:41) at C:\app\node_modules\@nestjs\core\router\router-execution-context.js:38:29 at processTicksAndRejections (node:internal/process/task_queues:95:5) at C:\app\node_modules\@nestjs\core\router\router-execution-context.js:46:28 at C:\app\node_modules\@nestjs\core\router\router-proxy.js:9:17
已确认使用的依赖版本为最新版,请问该如何解决这个问题?
解决方案
这个错误核心是tronWeb.transactionBuilder实例未正确初始化,导致调用方法时触发null对象赋值操作,可按以下步骤修复:
验证TronWeb实例初始化完整性
确保已正确配置节点信息且实例化无错误,初始化示例:import TronWeb from 'tronweb'; const tronWeb = new TronWeb({ fullHost: 'https://api.trongrid.io', // 替换为可用的TRON节点 privateKey: '你的私钥(按需配置)', }); // 主动验证连接状态 async function checkTronConnection() { const connected = await tronWeb.isConnected(); if (!connected) throw new Error('TronWeb节点连接失败'); }修正
estimateEnergy调用方式
直接通过合约实例调用方法并估算能耗,比直接用transactionBuilder更可靠,示例:// 先初始化合约实例 const usdtContract = await tronWeb.contract(abi, USDTContractAddress); // 调用方法并估算能耗 const estimatedEnergy = await usdtContract.balanceOf(address).estimateEnergy();若坚持使用
transactionBuilder.estimateEnergy,需严格匹配参数顺序:合约地址、方法选择器、配置项、方法参数、调用者地址,你的代码中abi参数位置错误,该方法无需传入abi,需提前通过合约实例或其他方式关联。确保NestJS中实例异步初始化完成
在NestJS服务中使用OnModuleInit钩子完成TronWeb初始化,避免未就绪就调用方法:import { Injectable, OnModuleInit } from '@nestjs/common'; import TronWeb from 'tronweb'; @Injectable() export class TronService implements OnModuleInit { private tronWebInstance: TronWeb; async onModuleInit() { this.tronWebInstance = new TronWeb({ fullHost: 'https://api.trongrid.io', }); // 等待连接验证完成 await this.tronWebInstance.isConnected(); } async getEstimatedEnergy(address: string) { const contract = await this.tronWebInstance.contract(abi, USDTContractAddress); return contract.balanceOf(address).estimateEnergy(); } }排查版本兼容性
若最新版存在bug,可尝试切换到稳定版本,比如:npm install tronweb@^4.0.0
内容的提问来源于stack exchange,提问作者Khairul Habib
相关产品推荐
相关产品推荐

