当向粒子(以前称为Spark)光子提交数据时,Lua会将空值索引化。

我和我的表弟一直在试验他的新 Photon 芯片,我们决定要有点创意,用 ComputerCraft(Minecraft 的模组)和一些 Lua 代码来驱动他造的小车。可惜,每次我们输入时,它索引的是空值;我们不确定是因为 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

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

我们正在尝试将字符串传递给一个 Photon 函数来驱动电机,但每次我们创建一个 redstone 信号时,它都会显示“Drive:11:尝试索引?(空值)”——但仅当 Photon 连接时。

点赞
用户4021682
用户4021682

我建议添加一个 print( tostring( returnData ) ) 并告诉我们它打印了什么。

非常有可能 returnData 是空值。

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

所有三个操作都使用句柄,这些句柄是包含从 HTTP 服务器返回的数据读取函数的表格。这些句柄与以只读文本模式返回的 fs.open 的 I/O 句柄相同,实现 close、readLine 和 readAll 方法。

因此,根据这些信息,我们知道 close 是一个有效的函数。加上您的错误提示,我们知道 returnData 是空值,而 http.post 在失败时返回空值。

排错步骤

所以,如我之前所提到的,您需要添加一个调用tostring 的打印语句,对 returnData 进行操作。这应该返回一个句柄,您可以在其上执行 returnData.readAll() 以获取请求中的信息。由于这不起作用,这很可能是因为请求失败了(当 http.post 失败时,会返回空值)。

要找出失败原因,我建议打印出它使用的 URL,并通过浏览器访问它。我还注意到您正在使用 token 作为您的提交数据。也许 Token 无效?

问题可能也由于传递 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 也可能需要进行 URL 兼容性检查。使用 这个 检查它是否兼容。

希望您可以找到问题的解决方法。

2016-01-10 06:26:00