尝试使用 Axios + Express.js 连接到 API 时收到“EHOSTUNREACH”

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

我开始通过使用 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)。任何解决问题的想法或谷歌关键字也非常受欢迎。 :)

node.js api express axios philips-hue
2个回答
0
投票

我也遇到了同样的错误,由于某种原因,我的 Hue 桥的 IP 地址发生了变化,所以我进入智能手机上的 Hue 应用程序并复制了新的 IP 地址。我不知道这是否有帮助,我是新来的。


0
投票

我从昨天开始就遇到了同样的错误,但找不到解决方案。真正导致我的问题的是,我调用的第 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"
           });
       }
});
© www.soinside.com 2019 - 2024. All rights reserved.