HTTP-запрос в AWS Лямбда не работает / NodeJS - PullRequest
0 голосов
/ 13 февраля 2020

я знаю, эта тема c обсуждалась очень часто. Но эти посты либо очень старые, либо не решают мою проблему. Так что я пробую открыть новый (другой). Я недавно начал делать Alexa Skills. Так что теперь мне удалось настроить свою AWS лямбда-функцию с помощью (также старого) учебника. На первом этапе все работало нормально. Итак, теперь я хочу отправить запрос GET на веб-сайт, просто чтобы получить код состояния. На следующем шаге Алекса должна рассказать мне этот код, но это другая история. Поэтому я попытался выполнить запрос с помощью разных фрагментов кода, но ничего не получалось. После прочтения различных сообщений я понимаю, что код работает быстрее, чем запрос может быть выполнен. Таким образом, ответ на запрос никогда не отображается в журналах. Это означает, что я не могу использовать его.

Это мой текущий код:

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
  }
};

Если я проверяю код с помощью лямбда-теста (включая JSON из Alexa для проверки подключение), журнал выглядит следующим образом.

  • 14: 48: 14 START RequestId: c8790cd2-81c9-4b8e-98a c -91b2ae6493f6 Версия: $ LATEST
  • 14: 48:14 2020-02-13T14: 48: 14.802Z c8790cd2-81c9-4b8e-98a c -91b2ae6493f6 INFO {версия: '1.0', сессия: {новое: правда, sessionId: 'amzn1.echo-api.session .0a26e495-1085-44e0-83f3-13937d026c1b ', приложение: {applicationId:' amzn1.ask.skill.42b0dea7-952e-4695-a3d2-ab951c98ac9 c '}, пользователь: {userId:' amzn1.ask.account .AHKG3FP33CDNS5PBKQESKQ73PAWMYTB7PRL4A2UGJTG77NOGSKKQBG5QNKVZ
  • 14: 48: 14 2020-02-13T14: 48: 14.802Z c8790cd2-81c9-4b8e-98a * 482 * 1014 143 * 93 -02-13T14: 48: 14.802Z c8790cd2-81c9-4b8e-98a c -91b2ae6493f6 ИНФОРМАЦИЯ О НАЗНАЧЕНИИ ИНТЕНТОВ
  • 14: 48: 14 2020-02-13T14: 48: 14.802Z c8790cd2-81c9-4b8e -98a c - 91b2ae6493f6 ИНФОРМАЦИЯ О НАМЕРЕННОМ ПРОВЕРКЕ СОЕДИНЕНИЕ
  • 14: 48: 14 2020-02-13T14: 48: 14.964Z c8790cd2-81c9-4b8e-98a c -91b2ae6493f6 INFO buildSpeechletResponse
  • 14: 48: 14 2020-02-13T14: 48: 14.964Z c8790cd2-81c9-4b8e-98a c -91b2ae6493f6 INFO generateResponse
  • 14: 48: 15 2020-02-13T14: 48: 15.042Z c8790cd2-81c9- 4b8e-98a c -91b2ae6493f6 ЗАПРОС ЗАКЛЮЧЕННОЙ СЕССИИ ИНФО

Насколько я вижу, код запускается в "INTENT CHECK CONNECTION", но журнал "asyn c function" никогда не показывает вверх. Так что здесь происходит? Код пропущен? Как мне получить работающий http запрос на современном уровне? (Извините, если мой пост не является "обычным способом". Это также мой первый пост)

Ответы [ 2 ]

0 голосов
/ 17 февраля 2020

Так что я понял это. Код, который я предоставил, был почти правильным. Функция запроса должна быть заключена в другую функцию. С небольшими изменениями он работал с этим кодом:

    // 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 голосов
/ 13 февраля 2020
In your code  exports.handler = async function(event) {} is the cause 

exports.handler всегда находится в функции ввода в AWS лямбда

Я просто удаляю этот код

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
  }
};
...