Events

如何在節點腳本中列印事件日誌和 stopWatching()?

  • June 6, 2017

我有以下腳本。我想stopWatching在列印事件日誌並自動終止正在執行的節點後執行此操作,但通過腳本我無法實現它。

執行.js:

Web3 = require("web3");
web3 = new Web3(new Web3.providers.HttpProvider("http://localhost:8545"));
exports.LogJob = function( blkNum ) {
   var event = myContractInstance.LogJob({}, { fromBlock: blkNum, toBlock: blkNum });
   event.watch( function (error, result) {
       console.log( JSON.stringify(result ) );                 
   });
   sleep.sleep(10);     //without those two lines it prints logs and pauses.
   event.stopWatching();//
}

ret = Log.Job( 100000 ); //I cannot return since watching is on.

執行:node run.js列印日誌後不會自行終止並像在while(). 請注意,如果我在呼叫它之後還有其他呼叫,LogJob()它總是在列印完所有內容後給出它的輸出。所以我不能返回輸出並做一些操作。

如果我stopWatching()在函式內 10 秒後執行此操作,現在它不會列印任何內容。

**$$ Q $$**如何在節點腳本中列印事件日誌和 stopWatching()?

請注意,當且僅當掃描塊上有日誌時,這才有效,否則它會再次暫停。當我們新的輸入成功輸入最新的塊時process.exit()

我想出了以下解決方案,它可以工作並解決了掛起的問題:

執行.js:

var fs = require('fs');
fs.unlinkSync("/tmp/test.txt");
Web3   = require("web3");
web3   = new Web3(new Web3.providers.HttpProvider("http://localhost:8545"));

address="0x..." 
abi=[...]
var myContractInstance  = web3.eth.contract(mylib.abi).at(mylib.address);

var event = myContractInstance.LogJob({}, { fromBlock: blkNum, toBlock: 'latest' });
event.watch( function (error, result) {
   fs.appendFile( "/tmp/test.txt", JSON.stringify(result) + '\n', function(err) { 
      process.exit();
   });
}

執行後node run.js我們可以發現輸出如下:

cat /tmp/test.txt

引用自:https://ethereum.stackexchange.com/questions/17170