博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
nodejs执行js文件和命令行下输入的区别
阅读量:6521 次
发布时间:2019-06-24

本文共 1765 字,大约阅读时间需要 5 分钟。

这里有一个nodejs文件,内容是部署编译好的sol文件到testrpc上
下面是该文件的内容:
Web3 = require('web3');web3 = new Web3(new Web3.providers.HttpProvider("http://localhost:8545"));web3.personal.newAccount('abc');//create a new account,used to store transfer fee//testrpc has 3 acccounts,this is the 4th.fs = require('fs');json_file = fs.readFileSync('dapp.json');dapp_info = JSON.parse(json_file);abiInfo = dapp_info.contractABI;byteCode = dapp_info.contractBYTE;coinContract = web3.eth.contract(abiInfo);deployed = coinContract.new(300000000,1,web3.eth.accounts[3],{data:byteCode,from:web3.eth.accounts[0],gas:3000000});console.log(deployed.address);//prompt undefined
在终端中node执行该js文件

$node deploy_contract.js

结果是
undefined

同样,将上面的代码在node命令行中单行下输入就能获得deployed.address的值(非undefined)
$node>Web3 = require('web3');>web3 = new Web3(new Web3.providers.HttpProvider("http://localhost:8545"));>web3.personal.newAccount('abc');//create a new account,used to store transfer fee...
这里的问题困扰了我两个晚上,后来发现是nodejs异步函数问题。
nodejs异步函数,最好做一个回调处理。
deployed = coinContract.new(300000000,1,web3.eth.accounts[3],{data:byteCode,from:web3.eth.accounts[0],gas:3000000});console.log(deployed.address);
这里就是异步函数,因为没加回调处理,导致deployed.address是undefined,若进行其他操作,如:transfer,也会出错。
但是,在node命令行下,单行输入都隐含了异步函数执行直到完成这个过程,一旦换成直接执行js文件,异步函数执行问题就出现了。
下面是这确使用方法:
deployed = coinContract.new(300000000,1,web3.eth.accounts[3],{from:web3.eth.accounts[0],data:byteCode,gas: 3000000}, function(err, coinContract){if(!err){    if(!coinContract.address)    {        console.log("Cannot get the deploy address");    }    else    {        console.log("Get the deploy address");        //do something    }}else{    console.log(err);}});
这里加了一个回调函数function(err, coinContract),但是仍然会提示Cannot get the deploy address(这个暂时我也没搞清楚),然后提示Get the deploy address

转载地址:http://jorfo.baihongyu.com/

你可能感兴趣的文章