部署以太坊智能合约时遇未处理Promise拒绝错误求助
解决Deploy.js合约部署的UnhandledPromiseRejection错误
这个错误的核心是你没有处理异步操作中可能出现的异常,导致Promise被拒绝时没有对应的捕获逻辑。下面给你两种直接有效的修复方式:
方法一:在async函数内部用try/catch包裹操作
把所有可能抛出异常的异步代码放在try块里,用catch捕获错误,同时加上finally确保进程能正常退出:
const HDWalletProvider=require('@truffle/hdwallet-provider') const Web3=require('web3') const {interface,bytecode}=require('./compile') const provider=new HDWalletProvider( 'MY SECRET KEY', 'https://eth-goerli.g.alchemy.com/v2/UVud9ZoAdGEt747J95NyOyUsS4bre3Oe' ); const web3=new Web3(provider); const deploy =async ()=>{ try { const accounts= await web3.eth.getAccounts(); console.log('Attempting to deploy from Account',accounts[0]); const result= await new web3.eth.Contract(JSON.parse(interface)) .deploy ({data:bytecode}) .send({gas:'1000000', from:accounts[0]}); console.log('合约部署成功,地址:', result.options.address); } catch (error) { console.error('部署失败,错误详情:', error); } finally { // 停止provider引擎,避免进程挂起 provider.engine.stop(); } }; deploy();
方法二:在调用deploy时添加.catch()处理
如果你不想修改deploy函数内部,可以在调用它的时候直接追加catch方法捕获错误:
const HDWalletProvider=require('@truffle/hdwallet-provider') const Web3=require('web3') const {interface,bytecode}=require('./compile') const provider=new HDWalletProvider( 'MY SECRET KEY', 'https://eth-goerli.g.alchemy.com/v2/UVud9ZoAdGEt747J95NyOyUsS4bre3Oe' ); const web3=new Web3(provider); const deploy =async ()=>{ const accounts= await web3.eth.getAccounts(); console.log('Attempting to deploy from Account',accounts[0]); const result= await new web3.eth.Contract(JSON.parse(interface)) .deploy ({data:bytecode}) .send({gas:'1000000', from:accounts[0]}); console.log('合约部署成功,地址:', result.options.address); provider.engine.stop(); }; // 追加catch处理错误 deploy().catch(error => { console.error('部署失败,错误详情:', error); provider.engine.stop(); });
额外说明
- 添加错误捕获后,你能看到具体的拒绝原因(比如gas额度不足、钱包密钥错误、网络连接失败等),方便进一步排查问题。
- 必须调用
provider.engine.stop(),否则Node.js进程会因为HDWalletProvider的持久连接一直处于挂起状态,无法自动退出。
内容的提问来源于stack exchange,提问作者33_KAWALE SUSHANT
相关产品推荐
相关产品推荐

