2016-05-02 11 views
0

私は自社のRocket Chatサーバーのスクリプトをhubotで書いています。学習のステップとして、私はforecast.ioからAPIデータを取得して特定のメンバーをユーザーに出力することにしました。しかし、ボットは私が試してもJSONを出力しません。本文全体を送信しようとすると「[object Object]」としか言わず、特定のメンバーを出力しようとすると "undefined"が送信されるか、何も送信されません。また、私は "json ['member'] ['member']"のような構文を使用してみましたが、 "json.member.member"(と私はインターネット上で両方見たことがあります)とどちらもうまくいきませんでした。どんな助けでも大歓迎です。前もって感謝します。 (注:私はFORECAST_KEYようなコードで書かれている私のAPIキーが含まれていませんでした)SOLVED HubotでCoffeescriptの解析済みJSONにアクセスできない

を解決しよう: 私は完全に何のNode.jsがすべてについて理解していませんでした。 Node.jsはイベントベースのです。つまり、リニアな順序でアクションを実行する代わりにイベントが発生したときにアクションを実行します。

私の問題は、データの復帰と関数の復帰の間にレイテンシがあったことです。より単純には、関数が空のコンテナを既に返すまで、リクエストは完了しませんでした。この問題は、コードに直接要求を入れるのではなく、別の関数を使用して私の住んでいた。

module.exports = (robot) -> 
    robot.hear /weather/i, (res) -> 
     testurl = "https://api.forecast.io/forecast/#{FORECAST_KEY}/37,-10" 
     data = httpRequest(robot, testurl, res) 
     res.send("Checking Weather...") 
     res.send("#{data['latitude']}") 
     res.send("#{data.latitude}") 

httpRequest = (robot, url, topRes) -> 
    topRes.http(url) 
     .get() (err, res, body) -> 
      #If error, display error 
      if err 
       topRes.send("Bot Encountered an Error :: #{err}") 
      else 
       #Try to parse JSON 
       tryBody = body 
       try 
        data = JSON.parse(tryBody) 
       catch e 
        #Catch error, return plain body 
        return body 
       #If not error, return JSON 
       return data 
+0

この問題が解決しましたか?簡単な 'JSON.stringify body'を使って生のJSONを見ることができます。 – wolfsgang

答えて

0

httpRequest関数でlogステートメントを追加しようとしましたか? httpRequestは名前付き関数であり、呼び出す前に宣言する必要があります。

変更コードへ:

httpRequest = (robot, url, topRes) -> 
    topRes.http(url) 
    .get() (err, res, body) -> 
     #If error, display error 
     if err 
      topRes.send("Bot Encountered an Error :: #{err}") 
     else 
      #Try to parse JSON 
      tryBody = body 
      try 
       data = JSON.parse(tryBody) 
      catch e 
       #Catch error, return plain body 
       return body 
      #If not error, return JSON 
      return data 

module.exports = (robot) -> 
    robot.hear /weather/i, (res) -> 
    testurl = "https://api.forecast.io/forecast/#{FORECAST_KEY}/37,-10" 
    data = httpRequest(robot, testurl, res) 
    res.send("Checking Weather...") 
    res.send("#{data['latitude']}") 
    res.send("#{data.latitude}") 

参考:https://softwareengineering.stackexchange.com/questions/191196/coffeescript-and-named-functions

・ホープ、このことができます。

ありがとう、 Phani。

関連する問題