如何使用Node.js AWS Lambda发送HTTP请求?

5
我正在使用AWS Lambda来开发Alexa Skill Kit。为了跟踪事件,我希望在启动时脚本发送HTTP请求,但是从云日志中可以看出,在执行过程中http.get函数被跳过了。
以下是代码(google.com替换了已在浏览器中测试的分析跟踪URL);
exports.handler = function (event, context) {

    var skill = new WiseGuySkill();
    var http = require('http');

    var url = 'http://www.google.com';
    console.log('start request to ' + url)
    http.get(url, function(res) {
        console.log("Got response: " + res.statusCode);
        // context.succeed();
    }).on('error', function(e) {
        console.log("Got error: " + e.message);
        // context.done(null, 'FAILURE');
    });
    console.log('end request to ' + url);

    skill.execute(event, context);
};

上下文对象已被注释掉,以允许“skill.execute”函数起作用,但无论如何,此HTTP请求都未执行。只记录了“start”和“end”console.logs,函数内部的那些没有记录。

这是异步问题吗?谢谢。


我只是复制并粘贴了你的 HTTP 请求代码,然后在我的控制台中得到了“开始请求 http://www.google.com”、“结束请求 http://www.google.com”和“收到响应:200”。你确定这个 handler 函数被调用了吗? - nick
2个回答

1
为了成功完成http请求,必须将http.get函数纳入回调函数中。否则进程将无法完成并会过早结束,使用回调允许http请求在继续执行函数的其余部分之前完成(有或没有错误)。
WiseGuySkill.prototype.eventHandlers.onLaunch = function (launchRequest, session, response) {

    // Call requestFunction to make the http.get call.
    // Get response from requestFunction using requestCallback
    requestFunction(function requestCallback(err) {

        // If error occurs during http.get request - respond with console.log
        if (err) {
            console.log('HTTP Error: request not sent');
        }

        ContinueIntent(session,response);
    });
};

'requestFunction'函数调用http.get并触发回调函数。

function requestFunction(requestCallback){

        var url = "http://www.google.com";

        http.get(url, function(res) {
            console.log("Got response: " + res.statusCode);
            requestCallback(null);
        }).on('error', function (e) {
            console.log("Got error: ", e);
        });
    }

显然,确保在脚本的开头需要使用“http”。 希望这能帮助其他刚接触此事的人!


1
我很好奇- 为什么您需要在另一个回调函数内包装请求?您传递给 http.get 请求的函数已经是一个回调函数了。 - nick

1
您需要确保处理程序被触发。有两种方法可以实现这一点:
  • 您可以设置一个新的API端点并在其上执行请求。
  • 您可以点击“测试”按钮,您的函数将使用给定的数据调用。
我复制并粘贴了您整个片段,除了第一行和最后一行(因为我没有在任何地方定义customSkill)。我能够获得200响应代码。

谢谢回复,这对我也有效。然而,customSkill实际上是亚马逊提供的“wiseGuy”Alexa Skill Kit示例(在此处找到https://github.com/amzn/alexa-skills-kit-js/tree/master/wiseGuy)(我已编辑问题以使其更清晰)。当在exports处理程序中执行wiseguy时,就好像http.get响应被阻止并且从未发送。在wiseguy代码中可能会导致这种情况? - user2075625
1
@user2075625 很有趣.. 你是否在开发者门户网站上注册了该技能?此外,你的服务器位于哪个地区?根据亚马逊的开发者页面:Alexa技能的Lambda函数必须托管在美国东部(弗吉尼亚北部)地区。目前,这是Alexa Skills Kit支持的唯一Lambda区域。 - nick
谢谢你在这方面的帮助,结果我需要在http.get请求中使用回调来确保请求被完全实现。我在我的答案中展示了工作原理。还是非常感谢你的时间! - user2075625
@user2075625 没问题,如果它对你有用,请确保将其标记为答案。 - nick

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接