我开始通过使用 Postman 发送请求来尝试 Philips Hue Bridge API。我能够验证自己的身份,创建用户,甚至成功地打开或关闭灯。 结论:我能够访问 API。
接下来,我制作了一个小型测试 javascript 文件,使用 Node.js 和
[email protected]
执行完全相同的操作。当我尝试以下代码时,一切正常,并且我收到了预期的 JSON 响应:
const axios = require('axios')
axios({
method: 'GET',
url: 'http://philips-hue.local/api/BYLCIlxABzz2eDHAxx70T'
})
.then(({data}) => {
console.log('------> AXIOS RES: ', data)
})
.catch((err) => {
console.log('------> AXIOS ERR: ', err)
})
结论:Axios 能够与 API 进行通信。
接下来我想将其构建到 Express.js 端点中。但是,当我尝试在
[email protected]
中使用相同的代码时,出现错误:
router.route('/getlights').get((req, res) => {
axios({
method: 'GET',
url: 'http://philips-hue.local/api/BYLCIlxABzz2eDHAxx70T/lights'
})
.then(({data}) => {
console.log('------> AXIOS RES: ', data)
res.json({
state: 'SUCCESS',
data
})
})
.catch((err) => {
console.log('------> AXIOS ERR: ', err)
res.json({
state: 'ERROR',
err
})
})
})
回应:
{
"state": "ERROR",
"err": {
"message": "connect EHOSTUNREACH 192.168.0.107:80",
"name": "Error",
"stack": "Error: connect EHOSTUNREACH 192.168.0.107:80\n at TCPConnectWrap.afterConnect [as oncomplete] (node:net:1161:16)",
"config": {
"url": "http://philips-hue.local/api/BYLCIlxABzz2eDHAxx70T/lights",
"method": "get",
"headers": {
"Accept": "application/json, text/plain, */*",
"User-Agent": "axios/0.21.1"
},
"transformRequest": [
null
],
"transformResponse": [
null
],
"timeout": 0,
"xsrfCookieName": "XSRF-TOKEN",
"xsrfHeaderName": "X-XSRF-TOKEN",
"maxContentLength": -1,
"maxBodyLength": -1
},
"code": "EHOSTUNREACH"
}
}
我开始解决问题,首先尝试将 URL 更改为随机的在线占位符,例如
http://jsonplaceholder.typicode.com/posts/1
,只是为了看看是否可以建立任何连接。这实际上立即起作用了。
这就是我真正困惑的地方。为什么我能够在 javascript 文件中使用 Postman 或 Axios 与网桥成功通信,但当 Express 使用相同的 Axios 代码时却无法与其连接。该问题似乎仅在同时使用 axios 和express 连接到桥接 API 时才会出现。
我已经尝试使用
node-fetch
和其他 3 个版本的 Axios 重新测试这一点。所有测试都以完全相同的方式失败。代码本身始终可以连接到 API,但是一旦代码被 Express 调用,就会导致 EHOSTUNREACH 错误。
我已经没有关于如何进一步谷歌这个问题的想法了,因为我不确定到底是什么导致了这个问题(express和/或axios和/或bridge)。任何解决问题的想法或谷歌关键字也非常受欢迎。 :)
我也遇到了同样的错误,由于某种原因,我的 Hue 桥的 IP 地址发生了变化,所以我进入智能手机上的 Hue 应用程序并复制了新的 IP 地址。我不知道这是否有帮助,我是新来的。
我从昨天开始就遇到了同样的错误,但找不到解决方案。真正导致我的问题的是,我调用的第 3 方 api 上有一个不记名令牌,我也通过标头传递它。
因此它被删除并通过标头传递令牌,它工作正常。
更新:如果发送另一个请求,错误会继续显示。 我找到的解决方案是使用
request
。
const request = require('request');
const headers = {
'Content-Type': 'application/json',
'token': `${token}`
};
const data = {
username : 'username'
}
let options = {
method: 'POST',
url: 'url',
port: 443,
headers: headers,
body: data,
json: true
};
request(options, async (error, res, body) => {
if (error) {
console.log({error});
return response.status(500).json({
status: false,
message: "Error occured"
});
} else {
console.log({body});
return response.status(201).json({
message: "success"
});
}
});