nodejs执行js文件和命令行下输入的区别

这里有一个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
    原文作者:chengshulei
    原文地址: https://segmentfault.com/a/1190000013884647
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞