我开始玩飞利浦顺桥API,使用邮递员发送请求。我能够验证自己,创建一个用户,甚至成功地打开或关闭灯。结论:我能够达到该API。
接下来,我使用Node.js和axios@0.21.4做了一个小型测试javascript文件来完成完全相同的工作。当我尝试以下代码时,一切正常,并收到预期的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端点中。然而,当我试图在express@4.17.1中使用相同的代码时,我会得到一个错误:
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"
}
}我开始解决这个问题,首先尝试将网址更改为像http://jsonplaceholder.typicode.com/posts/1这样的随机在线位置持有者,看看我是否可以建立任何连接。这个马上就起作用了。
这就是我真正感到困惑的地方。为什么我能够在javascript文件中使用Postman或Axios成功地与桥进行通信,但在express使用相同的Axios代码时却无法与之连接。这些问题似乎只有在使用axios和express连接到桥API时才会出现。
我已经尝试过用node-fetch和其他3种版本的Axios重新测试它。所有的测试都以同样的方式失败了。代码本身总是可以连接到API,但是一旦代码被express调用,它就会导致EHOSTUNREACH错误。
我没有关于如何进一步搜索这个问题的想法,因为我不确定到底是什么引起了这个问题(表达式和/或axios和/或bridge)。任何解决问题的想法或谷歌关键字也非常欢迎。:)
发布于 2022-02-10 16:31:02
我也犯了同样的错误,出于某种原因,我的色调桥的ip地址发生了变化,于是我进入智能手机上的色调应用程序,复制了新的ip地址。如果这有帮助的话,我在这里很新。
发布于 2022-11-08 16:46:46
从昨天起,我也犯了同样的错误,无法找到解决办法。真正导致我的原因是,在我调用的第三方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"
});
}
});https://stackoverflow.com/questions/70481456
复制相似问题