将数据发布到 Particle(以前的 Spark)Photon 时 Lua 索引 nil 值

问题描述 投票:0回答:1

我和我的表弟一直在试验他的新 Photon 芯片,我们决定发挥创意,使用 ComputerCraft(Minecraft 模组)和一些 Lua 代码来驾驶他制造的汽车。不幸的是,每次我们给出一个输入时,它都会索引一个 nil 值;我们不确定是否是因为 http.post 代码错误或我们不知道的东西......有什么想法吗?

URL = "https://api.particle.io/v1/devices/456456456456/updateMotors("
token = "access_token=123456789"
robotState = 0

while true do
    os.pullEvent("redstone")
    if((redstone.getInput("bottom") == true) and (robotState ~= 0)) then
      robotState = 0

      returnData = http.post(URL .. "\"0\"" .. ")", token)
      returnData.close()
    .....
    end
end

(代码的其余部分看起来与此相同,因此省略)

我们试图将字符串传递给将驱动电机的光子函数,但每次我们创建红石信号时,它都会显示“Drive:11:尝试索引?(零值)” - 但仅当光子已连接。

http lua minecraft computercraft particle-photon
1个回答
0
投票

我建议添加一个

print( tostring( returnData ) )
并让我们知道打印的内容。

很可能 returnData 为零。

以下是有关 HTTP 句柄的一些信息:

  • http://www.computercraft.info/wiki/Http.post
  • http://www.computercraft.info/wiki/HTTP_(API)#Handles
所有三个操作都使用句柄、表,其中包含读取从 HTTP 服务器返回的数据的函数。这些句柄的作用与只读文本模式下 fs.open 返回的 I/O 句柄相同,实现了 close、readLine 和 readAll 方法。

因此,有了这些信息,我们就知道

close

 是一个有效的函数。这与您的错误一起表明 
returnData
 为零,失败时由 
http.post
 返回。

故障排除步骤

因此,正如我之前提到的,您需要添加一条打印语句,在

tostring

 上调用 
returnData
。它
应该返回一个句柄,您可以对其执行returnData.readAll()
以从请求中获取信息。由于这不起作用,很可能是因为请求失败(当 
http.post
 失败时返回 nil)。

为了找出失败的原因,我建议打印出它正在使用的 URL 并通过浏览器访问它。我还注意到您使用

token

 作为您的帖子数据。也许令牌无效?

问题也可能是由于令牌的传递方式造成的。也许您不应该将其作为发布数据传递,而应该通过 URL 栏(PhP GET)传递它,如下所示:

returnData = http.post(URL .. "\"0\"" .. ")?"..token)



这将转换为

"https://api.particle.io/v1/devices/456456456456/updateMotors(\"0\")?access_token=123456789"



我没有使用此 API 的经验,但是 updateMonitor 中的零应该作为这样的字符串传递吗?如果是这样,那么也可能需要使 URL 兼容。使用

this 检查其是否兼容

希望你能解决问题。

© www.soinside.com 2019 - 2024. All rights reserved.