【问题标题】:Node JS request.post not firing in AWS Lambda节点 JS request.post 未在 AWS Lambda 中触发
【发布时间】:2017-05-25 10:43:20
【问题描述】:

我正在尝试构建一个 Alexa 技能,它在启动时必须通过 Node JS 请求模块发出发布请求来获取数据。

实际发出请求的代码摘录是有效的,因为我已经自己测试过了。但是,当我尝试将它包含在 AWS Lambda 函数中时,它不会被执行。

由于我是 JS 和 AWS 的初学者,因此调试这对我来说非常困难,而且我什至无法远程解决。它真正感谢任何帮助。

    exports.handler = (event, context) => {
    try {
        // New session
        if (event.session.new) {
            // New Session
            console.log("NEW SESSION");
        }

        // Launch Request
        switch (event.request.type) {
            case "LaunchRequest":
                var url = "https://api.random.org/json-rpc/1/invoke";
                var myRequest = {
                    "jsonrpc": "2.0",
                    "method": "generateStrings",
                    "params": {
                        "apiKey": "my-api-key",
                        "n": "1",
                        "length": "3",
                        "characters": "abcdefghijklmnopqrstuvwxyz0123456789"
                    },
                    "id": 96
                }
                var pin;
                request.post(
                    url,
                    {json: myRequest},
                    function (error, response, body) {
                        if (!error && response.statusCode == 200) {
                            pin = body.result.random.data[0];
                            console.log(pin);
                        }
                        else {
                            console.log(error);
                        }
                    }
                );
                console.log("LAUNCH REQUEST");
                var welcome = "Welcome. ";
                var pinStatement = "Your 3 letter or number pin is: " + pin
                context.succeed(
                    generateResponse(
                        buildSpeechletReponse(welcome + pinStatement, true),
                        {}
                    )
                );
                break;
            // Intent Request
            case "IntentRequest":
                console.log("INTENT REQUEST");
                break;

            // Session Ended Request
            case "SessionEndedRequest":
                console.log("SESSION ENDED REQUEST");
                break;

                default:
                    context.fail(`INVALID REQUEST TYPE: ${event.request.type}`);
            }
        }
        catch (error) {
            context.fail(`Exception: ${error}`);
        }
    }

//Here are the helper functions: 

  buildSpeechletReponse = (outputText, shouldEndSession) => {
    return {
        outputSpeech : {
            type: "PlainText",
            text: outputText
        },
        shouldEndSession: shouldEndSession
    };
}

    generateResponse = (sessionAttributes, speechletResponse) => {

    return {
        version: "1.0",
        sessionAttributes: sessionAttributes,
        response: speechletResponse
    };
}

【问题讨论】:

  • 您是这样粘贴代码还是上传带有代码的压缩包?
  • 上传了 zip(所以它有 require 模块)。我没有看到错误消息。它只是跳过了 request.post 部分。

标签: javascript node.js amazon-web-services post lambda


【解决方案1】:

在您的请求收到响应之前,您正在调用context.succeed()

case "LaunchRequest":
  var url = "https://api.random.org/json-rpc/1/invoke";
  var myRequest = {
      "jsonrpc": "2.0",
      "method": "generateStrings",
      "params": {
          "apiKey": "my-api-key",
          "n": "1",
          "length": "3",
          "characters": "abcdefghijklmnopqrstuvwxyz0123456789"
      },
      "id": 96
  }
  var pin;
  request.post(
      url,
      {json: myRequest},
      function (error, response, body) {
          if (!error && response.statusCode == 200) {
              pin = body.result.random.data[0];
              console.log(pin);
              var response = buildSpeechletReponse("Welcome. Your 3 letter or number pin is: " + pin, true)
              context.succeed(generateResponse(response, {}));
          }
          else {
              context.fail(error || body);
          }
      }
  );
  console.log("LAUNCH REQUEST");
  break;

【讨论】:

  • 谢谢!这样可行。据我所知,JS不会等到request.post返回一些东西?
  • @MikiP 大部分是正确的。对request.post() 的调用确实 同步返回,但它也会启动一个异步进程,该进程将在完成时调用您的回调。所以pin 只会在该回调中有一个值。
  • 我明白了。再次感谢!
猜你喜欢
  • 1970-01-01
  • 2020-12-22
  • 1970-01-01
  • 1970-01-01
  • 2021-06-19
  • 2022-07-20
  • 2015-11-15
  • 2012-01-27
  • 2016-06-01
相关资源
最近更新 更多