Fehler in DAPP, das mit dem 'Truffle'-Framework entwickelt wurde - Problem beim Abrufen des Ergebnisses von Oraclize-Query

Ich entwickle eine Dapp mit 'testrpc' und 'truffle'-3.1.1. Ich habe auch Ethereum-Bridge für Oraclize verwendet. Ich habe eine intelligente Vertragsfunktion geschrieben, die eine URL mit 'OraclizeQuery' aufruft.

Das Folgende ist der Vertragscode:-

 pragma solidity ^0.4.0;

 import "./usingOraclize.sol";
 contract WeatherApiCall is usingOraclize {
       string public weathercondition;
       event LOG_OraclizeCallback(
              bytes32 queryId,
              string result
       );
       function WeatherApiCall() {
            OAR = OraclizeAddrResolverI(0x44bc501f0d92a9583877636828f52abc9da5d585);//OAR address
      }
      function __callback(bytes32 myid, string result) {
              if (msg.sender != oraclize_cbAddress()) throw;
              weathercondition=result;
              LOG_OraclizeCallback(myid,result);
      }
      function update(string to,string datetime) payable returns(bool sufficient) {

              oraclize_query("URL", strConcat("json(http://api.openweathermap.org/data/2.5/forecast?q='", to ,"'&mode=json&APPID=d2e8279188c8649c17540f798c9cc972).list[?(@.dt_txt='", datetime, "')].weather[0].main"));
              return true;
  }
}

Das Folgende ist die index.html-Datei: -

<!DOCTYPE html>
<html>
<head>
      <title>Sample Truffle App</title>
      <link href='https://fonts.googleapis.com/css?family=Open+Sans:400,700' rel='stylesheet' type='text/css'>
      <script src="./app.js"></script>
</head>
<body>
        <h1>Airline</h1>
        <h2>Example Truffle Dapp</h2>
        <br>
       <h1>Form</h1>
               <br><label for="from">From:</label><input type="text" id="from" placeholder="--Residing Place--"></input>
               <br><label for="to">To:</label><input type="text" id="to" placeholder="--Travelling Place--"></input>
               <br><label for="persons">No. of Persons:</label><input type="text" id="persons" placeholder="--No. of Persons--"></input>
               <br><label for="date">Travel Date:</label><input type="text" id="date" placeholder="--Date of travel yyyy-MM-dd--"></input>
               <br><label for="time">Destination Time:</label><input type="text" id="time" placeholder="--HH:mm:ss--"></input>
               <br><br><button id="send" onclick="App.sendRequest()">Generate Quote</button> 
<br><br>
</body>
</html>

Das Folgende ist die app.js-Datei.

  // Import the page's CSS. Webpack will know what to do with it.
  import "../stylesheets/app.css";

 // Import libraries we need.
 import { default as Web3} from 'web3';
 import { default as contract } from 'truffle-contract'

 // Import our contract artifacts and turn them into usable abstractions.
 import weatherapicall_artifacts from '../../build/contracts/WeatherApiCall.json'

// WeatherApiCall is our usable abstraction, which we'll use through the code below.
var WeatherApiCall = contract(weatherapicall_artifacts);

 // The following code is simple to show off interacting with your contracts.
// As your needs grow you will likely need to change its form and structure.
// For application bootstrapping, check out window.addEventListener below.
var accounts;
var account;


  window.App = {
    start: function() {
    var self = this;

    // Bootstrap the WeatherApiCall abstraction for Use.
    WeatherApiCall.setProvider(web3.currentProvider);

   // Get the initial account balance so it can be displayed.
   web3.eth.getAccounts(function(err, accs) {
          if (err != null) {
             alert("There was an error fetching your accounts.");
             return;
          }

         if (accs.length == 0) {
               alert("Couldn't get any accounts! Make sure your Ethereum client is configured correctly.");
               return;
         }

          accounts = accs;
          account = accounts[0];
     });
  },

  sendRequest: function() {
         var queryRecheck = function(contract){

         var bn = web3.eth.blockNumber; // returns the current block number
         var logger = contract.LOG_OraclizeCallback(null, { fromBlock: bn });

        console.log('Waiting on Oraclize queries...');
        console.log(bn);
        console.log(logger);

                 return new Promise(function (resolve, reject) {
                        var ctr = setInterval(function () {
                        logger.get(function (error, events) {
                        if (error)
                             reject(error);

                        try {
                              if (typeof events !== 'undefined') {
                                  events.forEach(function (evt) {
                                      if (evt.args.block.toNumber() > bn) {
                                       clearInterval(ctr);
                                       resolve();
                                    }
                              });
                      }
                      } catch (e) {
                         console.log('Error encountered during query wait: ' + e);
                         reject(e);
                     }
                 });
                 }, 50000);
                });
              }
              var self = this;
              var fromdata = document.getElementById("from").value;
              var to = document.getElementById("to").value;
              var persons = parseInt(document.getElementById("persons").value);
              var date = document.getElementById("date").value;
              var time = document.getElementById("time").value;
             //verifying at javascript console
              console.log(fromdata);
              console.log(to);
              console.log(persons);
              console.log(date);
              console.log(time);
              var timeperiod;
              if ((time >= '00:00:00') && (time < '03:00:00')) {
                        timeperiod = '00:00:00';
              } else if ((time >= '03:00:00') && (time < '06:00:00')) {
                        timeperiod = '03:00:00';
              } else if ((time >= '06:00:00') && (time < '09:00:00')) {
                        timeperiod = '06:00:00';
              } else if ((time >= '09:00:00') && (time < '12:00:00')) {
                        timeperiod = '09:00:00';
              } else if ((time >= '12:00:00') && (time < '15:00:00')) {
                        timeperiod = '12:00:00';
              } else if ((time >= '15:00:00') && (time < '18:00:00')) {
                        timeperiod = '15:00:00';
              } else if ((time >= '18:00:00') && (time < '21:00:00')) {
                        timeperiod = '18:00:00';
              } else if ((time >= '21:00:00') && (time < '24:00:00')) {
                        timeperiod = '21:00:00';
              }
              var datetime = date + ' ' + timeperiod;
              console.log(datetime);

               WeatherApiCall.deployed().then(function(instance) {

                          console.log("Initializing");
                          instance.update(to,datetime, {from: account, gas: 3000000, value: web3.toWei(1, 'ether')})
                               .then(function(v){
                                       console.log(v);
                                       console.log("Function Executed");
                                       return queryRecheck(instance);
                                 }).then(function(events) {
                                       console.log(events);
                                 });
                       }).then(function() {
                                              console.log("Testing");
                       }).catch(function(e) {
                                               console.log(e);
                       });
  }
};

 window.addEventListener('load', function() {
      // Checking if Web3 has been injected by the browser (Mist/MetaMask)
      if (typeof web3 !== 'undefined') {
      console.warn("Using web3 detected from external source. If you find that your accounts don't appear or you have 0 MetaCoin, ensure you've configured that source properly. If using MetaMask, see the following link. Feel free to delete this warning. :) http://truffleframework.com/tutorials/truffle-and-metamask")
      // Use Mist/MetaMask's provider
      window.web3 = new Web3(web3.currentProvider);
      } else {
               console.warn("No web3 detected. Falling back to http://localhost:8545. You should remove this fallback when you deploy live, as it's inherently insecure. Consider switching to Metamask for development. More info here: http://truffleframework.com/tutorials/truffle-and-metamask");
               // fallback - use your fallback strategy (local node / hosted node + in-dapp id mgmt / fail)
              window.web3 = new Web3(new Web3.providers.HttpProvider("http://localhost:8545"));
               }
              App.start();
 });

Das Folgende ist die Ausgabe, die in der Javascript-Konsole generiert wird: -

 "No web3 detected. Falling back to http://localhost:8545. You should remove this fallback when you deploy live, as it's inherently insecure. Consider switching to Metamask for development. More info here: http://truffleframework.com/tutorials/truffle-and-metamask"    app.js:25575:5
 india                     app.js:25520:4
 chennai                   app.js:25521:4
 2                         app.js:25522:4
 2017-03-02                app.js:25523:4
 12:00                     app.js:25524:4
 2017-03-02 09:00:00       app.js:25544:4
 Initializing              app.js:25549:27
 Testing                   app.js:25561:50
  Object { tx: "0xcaf76e6444507c3fb48007c3e7307a8dc…", receipt: Object, logs: Array[0] }               app.js:25552:41
  Function Executed        app.js:25553:41
  Waiting on Oraclize queries... app.js:25486:8
  15                       app.js:25487:8
  Object { requestManager: Object, options: Object, implementation: Object, filterId: null, callbacks: Array[0], getLogsCallbacks: Array[0], pollFilters: Array[0], formatter: bound () }        app.js:25488:8
  Error encountered during query wait: TypeError: evt.args.block is undefined                       app.js:25506:24
  Error encountered during query wait: TypeError: evt.args.block is undefined                       app.js:25506:24
  Error encountered during query wait: TypeError: evt.args.block is undefined                       app.js:25506:24

Ich habe versucht, das Ergebnis von Oraclize-Query in der Javascript-Konsole zu drucken ... Aber es gibt den Fehler zurück ... Wie kann es gelöst werden?

Antworten (1)

Stellen Sie sicher, dass Ihr Ereignis wie vorgesehen funktioniert und nicht leer ist (fügen Sie einige console.log-Dateien hinzu, eventsbevor Sie es verarbeiten). Wie Sie sehen block, fehlt im evtObjekt, wahrscheinlich weil Ihr LOG_OraclizeCallbackEvent ( https://github.com/Kottackal-ET-Practice/Flight-Dapp/blob/d5f6e5a661517e00ff37f48052b5e3a1afa8558d/contracts/WeatherApiCall.sol#L8-L13 ) dies nicht tut blockWenn Sie versuchen, die Blocknummer aus dem Protokoll zu erhalten, können Sie über den Parameter blockNumberim evtObjekt ( evt.blockNumber) darauf zugreifen.