无法使用Hubot在Coffeescript中访问已解析的JSON

时间:2016-05-02 21:01:45

标签: json coffeescript hubot

我正在使用hubot为我公司的Rocket Chat服务器编写脚本。作为学习步骤,我决定尝试从forecast.io获取API数据并将某些成员输出给用户。但是,无论我尝试什么,我的机器人都不会输出JSON。当我尝试发送整个身体时,它只会说" [object Object]"当我尝试输出某些成员时,它会发送" undefined"或者它根本不发送任何东西。此外,我尝试使用类似" json ['成员'] ['成员']"等语法。并喜欢" json.member.member" (我在互联网上看到过这两种情况)并且都没有奏效。任何帮助是极大的赞赏。提前致谢。 (注意:我没有包含我在代码中写为FORECAST_KEY的API密钥)

解决: 我并不完全了解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

1 个答案:

答案 0 :(得分:0)

您是否尝试在httpRequest函数中添加日志语句? 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。