AWS Lambda中的HTTP请求不起作用/ NodeJS

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

我知道,这个话题经常被讨论。但是这些帖子要么很老,要么不能解决我的问题。所以我尝试打开一个新的(另一个)。我最近开始制作Alexa技能。因此,现在我借助(也是很旧的)教程成功设置了我的AWS Lambda函数。第一步一切正常。因此,现在我想向网站发送GET请求,只是为了获取状态码。下一步,Alexa应该告诉我这个代码-但这就是一个不同的故事。因此,我尝试使用许多不同的代码段来完成请求-但没有任何效果。阅读各种文章后,我了解代码运行得更快,然后可以执行请求。因此,请求的答案永远不会显示在日志中。这意味着,我无法利用它。

这是我当前的代码:

exports.handler = async (event, context, callback) => {
  try {
    console.log(event)
    if (event.session.new) {
      console.log("new session");
    }
    switch (event.request.type) {
      case "LaunchRequest":
        console.log("LAUNCH REQUEST");
        context.succeed(
          generateResponse(
            buildSpeechletResponse("This is a launch request", true), {}
          )
        )
        break;
      case "IntentRequest":
        console.log("INTENT REQUEST")
        switch (event.request.intent.name) {
          case "checkConnection":
            console.log("INTENT CHECK CONNECTION")
            const https = require('https')
            let url = "xxx/xxx/bc/alexa"
            exports.handler = async function(event) {
              console.log("async function")
              const promise = new Promise(function(resolve, reject) {
                https.get(url, (res) => {
                  resolve(res.statusCode)
                }).on('error', (e) => {
                  reject(Error(e))
                })
              })
              return promise
            }
            context.succeed(null, generateResponse(
              buildSpeechletResponse("server answered with code " + this.statusCode, true), {}));
            break;
        }
      case ("SessionEndedRequest"):
        console.log("SESSION ENEDED REQUEST")
        break;
      default:
        context.fail(`INVALID REQUEST TYPE: ${event.request.type}`);
        break;
    }
  }
  catch (error) { context.fail(`Exception: ${error}`) }
}
// Helpers
buildSpeechletResponse = (outputText, shouldEndSession) => {
  console.log("buildSpeechletResponse");
  return {
    outputSpeech: {
      type: "PlainText",
      text: outputText
    },
    shouldEndSession: shouldEndSession
  }
};
generateResponse = (speechletResponse, sessionAttributes) => {
  console.log("generateResponse")
  return {
    version: "1.0",
    sessionAttributes: sessionAttributes,
    response: speechletResponse
  }
};

如果我通过lambda测试(包括来自Alexa的JSON来检查连接)来测试代码,则日志如下所示。

  • 14:48:14 START RequestId:c8790cd2-81c9-4b8e-98ac-91b2ae6493f6版本:$ LATEST
  • [14:48:14 2020-02-13T14:48:14.802Z c8790cd2-81c9-4b8e-98ac-91b2ae6493f6 INFO {版本:“ 1.0”,会话:{新增:true,sessionId:'amzn1.echo-api。 session.0a26e495-1085-44e0-83f3-13937d026c1b',应用程序:{applicationId:'amzn1.ask.skill.42b0dea7-952e-4695-a3d2-ab951c98ac9c'},用户:{userId:'amzn1.ask.account.AHKG3FP33CDNS5PB
  • [14:48:14 2020-02-13T14:48:14.802Z c8790cd2-81c9-4b8e-98ac-91b2ae6493f6 INFO新会话
  • [14:48:14 2020-02-13T14:48:14.802Z c8790cd2-81c9-4b8e-98ac-91b2ae6493f6信息意图请求
  • [14:48:14 2020-02-13T14:48:14.802Z c8790cd2-81c9-4b8e-98ac-91b2ae6493f6信息意图检查连接
  • [14:48:14 2020-02-13T14:48:14.964Z c8790cd2-81c9-4b8e-98ac-91b2ae6493f6信息buildSpeechletResponse
  • [14:48:14 2020-02-13T14:48:14.964Z c8790cd2-81c9-4b8e-98ac-91b2ae6493f6 INFO generateResponse
  • [14:48:15 2020-02-13T14:48:15.042Z c8790cd2-81c9-4b8e-98ac-91b2ae6493f6信息会议要求)

据我所知,该代码运行到“ INTENT CHECK CONNECTION”,但是日志“异步功能”从未显示。那么这里发生了什么?代码被跳过了吗?我如何设法获得有效的http请求状态? (对不起,如果我的帖子不是“普通方法”。这也是我的第一篇帖子)

node.js amazon-web-services aws-lambda get alexa-skill
2个回答
0
投票

所以我想通了。我提供的代码几乎是正确的。请求功能需要封装为另一个功能。稍作调整,便可以使用以下代码:

    // HTTP Request Function
function httpGet(options) {
  const https = require('https');
  return new Promise(((resolve, reject) => {
    const request = https.request(options, (response) => {
      response.setEncoding('utf8');
      let returnData = '';
      if (response.statusCode < 200 || response.statusCode >= 300) {
        return reject(new Error(`${response.statusCode}: ${response.req.getHeader('host')} ${response.req.path}`));
      }
      response.on('data', (chunk) => {
        returnData += chunk;
      });
      response.on('end', () => {
        resolve(response.statusCode); //Fill response with status code
      });
      response.on('error', (error) => {
        reject(error);
      });
    });
    request.end();
  }));
}

0
投票
In your code  exports.handler = async function(event) {} is the cause 

exports.handler始终在AWS lambda中处于输入功能中

我只是删除了此代码

exports.handler = async (event, context, callback) => {
  try {
    console.log(event)
    if (event.session.new) {
      console.log("new session");
    }
    switch (event.request.type) {
      case "LaunchRequest":
        console.log("LAUNCH REQUEST");
        context.succeed(
          generateResponse(
            buildSpeechletResponse("This is a launch request", true), {}
          )
        )
        break;
      case "IntentRequest":
        console.log("INTENT REQUEST")
        switch (event.request.intent.name) {
          case "checkConnection":
            console.log("INTENT CHECK CONNECTION")
            const https = require('https')
            let url = "xxx/xxx/bc/alexa"

                https.get(url, (res) => {
                   context.succeed(null, generateResponse(
              buildSpeechletResponse("server answered with code " + res.statusCode, true), {}));
                }).on('error', (e) => {
// handle error here
                  reject(Error(e))
                })
              })


            break;
        }
      case ("SessionEndedRequest"):
        console.log("SESSION ENEDED REQUEST")
        break;
      default:
        context.fail(`INVALID REQUEST TYPE: ${event.request.type}`);
        break;
    }
  }
  catch (error) { context.fail(`Exception: ${error}`) }
}
// Helpers
buildSpeechletResponse = (outputText, shouldEndSession) => {
  console.log("buildSpeechletResponse");
  return {
    outputSpeech: {
      type: "PlainText",
      text: outputText
    },
    shouldEndSession: shouldEndSession
  }
};
generateResponse = (speechletResponse, sessionAttributes) => {
  console.log("generateResponse")
  return {
    version: "1.0",
    sessionAttributes: sessionAttributes,
    response: speechletResponse
  }
};
© www.soinside.com 2019 - 2024. All rights reserved.