Node.js Axios在特定API的AWS Lambda上始终超时

Node.js Axios在特定API的AWS Lambda上始终超时,node.js,axios,Node.js,Axios,描述问题 我不确定这是否是Axios的问题。以下代码在我的本地开发机器上成功运行,但每当我从云端(例如AWS Lambda)运行它时总是超时。在repl.it上运行时也会发生同样的情况 我可以确认AWS Lambda可以访问互联网,并且它适用于任何其他API,但以下情况除外: 示例代码 环境 Axios版本:0.19.2 运行时:nodejs12x 更新1 我尝试了本机require'https',它在本地主机和云服务器上都超时了。请在此处找到示例代码: 同样,我可以确认相同的代码可以在任何其他

描述问题

我不确定这是否是Axios的问题。以下代码在我的本地开发机器上成功运行,但每当我从云端(例如AWS Lambda)运行它时总是超时。在repl.it上运行时也会发生同样的情况

我可以确认AWS Lambda可以访问互联网,并且它适用于任何其他API,但以下情况除外:

示例代码

环境

Axios版本:0.19.2 运行时:nodejs12x 更新1

我尝试了本机require'https',它在本地主机和云服务器上都超时了。请在此处找到示例代码:

同样,我可以确认相同的代码可以在任何其他API上工作

更新2

我怀疑这是服务器端的问题,因为它在curl中的行为也非常奇怪

来自本地的curl->403访问被拒绝 使用用户代理标题->成功从本地卷取 来自云服务器的curl->403访问被拒绝
它必须是服务器端验证,与AkamaiGHost相关。

正如Akshay所建议的,您可以使用try-and-catch块来获取错误。也许这对你有帮助

您是否为异步调用配置了错误处理

要配置错误处理,请执行以下步骤:

打开Lambda控制台

选择一个函数

在异步调用下,选择编辑

配置以下设置

最长事件期限–Lambda在异步事件队列中保留事件的最长时间,最长为6小时

重试次数–函数返回错误时Lambda重试的次数,介于0和2之间

选择保存

axios是浏览器和node.js中唯一一个基于Promise的HTTP客户端,当您设置timeout:10000时,我相信超时问题不会就此结束

虽然你的API

在浏览器和呈现JSON数据方面工作正常

默认情况下,lambda的函数超时是15分钟,我相信这对于响应来说已经足够了。可能还有另一个问题。 确保您已经按照文档中的建议设置了其他配置,如权限等。
您可以检查AWS lambda的默认限制。

根据Akshay的建议,您可以使用try-and-catch块获取错误。也许这对你有帮助

您是否为异步调用配置了错误处理

要配置错误处理,请执行以下步骤:

打开Lambda控制台

选择一个函数

在异步调用下,选择编辑

配置以下设置

最长事件期限–Lambda在异步事件队列中保留事件的最长时间,最长为6小时

重试次数–函数返回错误时Lambda重试的次数,介于0和2之间

选择保存

axios是浏览器和node.js中唯一一个基于Promise的HTTP客户端,当您设置timeout:10000时,我相信超时问题不会就此结束

虽然你的API

在浏览器和呈现JSON数据方面工作正常

默认情况下,lambda的函数超时是15分钟,我相信这对于响应来说已经足够了。可能还有另一个问题。 确保您已经按照文档中的建议设置了其他配置,如权限等。
您可以检查AWS lambda的默认限制。

您应该尝试将axios调用包装到try/catch中,这样可能会发现问题

const axios = require('axios');

const handler = async () => {
    try {
        const url = 'https://www.target.com.au/ws-api/v1/target/products/search?category=W95362';

        const response = await axios.get(url, { timeout: 10000 });
        console.log(typeof (response));
        console.log(response);

    } catch (e) {
        console.log(e, "error api call");
    }
}

handler();

您应该尝试将axios调用包装到try/catch中,这可能会解决问题

const axios = require('axios');

const handler = async () => {
    try {
        const url = 'https://www.target.com.au/ws-api/v1/target/products/search?category=W95362';

        const response = await axios.get(url, { timeout: 10000 });
        console.log(typeof (response));
        console.log(response);

    } catch (e) {
        console.log(e, "error api call");
    }
}

handler();

您可能已将Lambda功能放置在VPC中,而无法访问外部世界的Internet。尝试检查lambda配置中的VPC部分,并相应地设置一个internet网关

您可能已将lambda功能放置在一个无法访问外部世界的VPC中。尝试检查lambda配置中的VPC部分,并相应地设置internet网关

谢谢Akshey。我已经用try/catch更新了repl.it脚本。错误只是说10000毫秒内超时。我用更多的发现更新了这个问题。这似乎是服务器端的问题,与AkamaiGHost有关。谢谢Akshey。我已经用try/catch更新了repl.it脚本。错误只是说10000毫秒内超时。我用更多的发现更新了这个问题。这似乎是服务器端的问题,与AkamaiGHost有关。谢谢你的建议。我用更多的发现更新了这个问题。这似乎是服务器端的问题。我已经看过关于AkamaiGHost的几个主题,但似乎还没有解决办法。嗨,Deep。谢谢你的建议。我用更多的发现更新了这个问题。这似乎是服务器端的问题。我已经看过关于AkamaiGHost的几个主题,但似乎还没有解决办法。我也看到了这种行为。捕获是没有帮助的,因为承诺永远不会兑现。我将超时设置为900,但它没有完成。我也看到了
这种行为。捕获是没有帮助的,因为承诺永远不会兑现。我将超时设置为900,但未完成。+1如果要检查代码中是否有问题,请先将功能移出VPC(如果在VPC中),然后测试Axios是否在Lambda控制台上工作。+1如果要检查代码中是否有问题,如果在VPC中,只需先将您的功能移出VPC,然后测试Axios是否在Lambda控制台上工作即可。
const axios = require('axios');

const handler = async () => {
    try {
        const url = 'https://www.target.com.au/ws-api/v1/target/products/search?category=W95362';

        const response = await axios.get(url, { timeout: 10000 });
        console.log(typeof (response));
        console.log(response);

    } catch (e) {
        console.log(e, "error api call");
    }
}

handler();