javascript - Node JS request.post 在 AWS Lambda 中未触发

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

我正在尝试构建 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
    };
}

最佳答案

您在请求收到响应之前调用 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;

关于javascript - Node JS request.post 在 AWS Lambda 中未触发,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41577371/

相关文章:

amazon-web-services - 如何将 API 网关指向 CDK 中的 lambda 别名?

json - AWS CloudFormation Cognito 身份提供商 (SAML)

java - 将天数转换为周数的数学公式是什么

javascript - jQuery 父动画第二次单击(关闭/回滚)不起作用

javascript - updatePixels() 实际上并未更新像素

node.js - 如何指定xsi :type for an element in SOAP request using node-soap

javascript - 每次输入时的输入字段都失去焦点

javascript - "constructor"不打算与构造函数调用一起使用的函数

node.js - Heroku 导入时崩溃 'aws-sdk'

amazon-web-services - 使用 CloudFormation 更新 AWS Lambda 函数