我正在使用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
答案 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。