Я не получаю соответствующий ответ JSON от Amazon Lambda

Привет, полезные люди из StackOverflow! Я обнаружил, что нуждаюсь в вашей помощи и опыте. Я следую учебному пособию по созданию навыков Amazon Alexa, когда я тестирую код для лямбда-функции, он преуспевает, однако, когда я использую образец высказывания, которое я ему назначил, а именно «получить текущую погоду» (не обращайте внимания на то, что высказывание не имеет отношения к фактической конечной точке, на данный момент я использую конечную точку из заполнителей json: https://jsonplaceholder.typicode.com/users, потому что я просто хочу получить ответ любого типа). Я определенно был бы признателен за любую форму помощи! Заранее спасибо, ребята и девчонки!

Вот мой код:

var https = require("https");



exports.handler = (event, context) => {

  try{

    if (event.session.new){
    // New Session
    console.log("new session!");
}
  switch (event.request.type){

    case "LaunchRequest":
    // > Launch Request
      console.log("launch request!");
      context.succeed(
        generateResponse(
          buildSpeechletResponse("Welcome!!!!!!!! Let's make this work!", true),
          {}
          )
      )
      break;

    case "IntentRequest":
    // > Intent Request
      console.log("intent request!"); // endpoint added here below
      switch(event.request.intent.name){
        case "getWeatherIntent":
          var endpoint = "https://jsonplaceholder.typicode.com/users"; // this works with this "placebo endpoint data" https://jsonplaceholder.typicode.com/posts ***** api.openweathermap.org/data/2.5/weather?zip=10005,us&APPID=08d6215ef934232110949692d5ffb8da
          var body = ""
          https.get(endpoint, (response) => {
            response.on('data', (chunk) => {body += chunk})
            response.on('end', () => {
              var data = JSON.parse(body);
              var weatherCount = data.userId; // might have something to do with this variable
              context.succeed(
                generateResponse(
                  buildSpeechletResponse("current is ${weatherCount}", true),
                  {}
                  )
                )
            })
          })
      }
      break; // endpoint added here above

    case "SessionEndedRequest":
    // > Session Ended Request
      console.log("session ended request!");
      break;

    default:
      context.fail("invalid request type!: {event.request.type}");
  }

  } catch(error) {context.fail("Exception: ${error}")}



}

// Helpers
buildSpeechletResponse = (outputText, shouldEndSession) => {
  return{
    outputSpeech:{
      type: "PlainText",
      text: outputText
    },
    shouldEndSession: shouldEndSession
  }
}

generateResponse = (speechletResponse, sessionAttributes) => { 
  return {
    version: "1.0",
    sessionAttributes: sessionAttributes,
    response: speechletResponse
  }
}

Также вот схема намерения:

{
  "intents":[
   { "intent": "getWeatherIntent"
   }
  ]
}

Вот лямбда-запрос:

{
  "session": {
    "sessionId": "SessionId.51e05faf-df95-420f-9cfc-3736b1839482",
    "application": {
      "applicationId": "amzn1.ask.skill.482872e5-20a2-4230-bce4-a06b212443e5"
    },
    "attributes": {},
    "user": {
      "userId": "amzn1.ask.account.AFOFPAF44SZKQRQDFH3FW7PZCVEZPXLLPPWT7CO76Z62I2DVI5EFTYSFD3YMEA56R4ACYUSPTPVFGCA2BCFJCNBVLBNWAWSIOCXHCDTW5UM5WNIRE6K35XZ67CM3W2DN3NLIPRVEFWBZ3D6ASD37EYJWBQQFOK4FXB5NMGQCLJVGBJKUJMCZXVEHXU74KLSDXOV5MIF3UZPFLRA"
    },
    "new": true
  },
  "request": {
    "type": "IntentRequest",
    "requestId": "EdwRequestId.4b18c102-47ea-4855-a5da-6407379c0384",
    "locale": "en-US",
    "timestamp": "2017-02-28T02:13:25Z",
    "intent": {
      "name": "getWeatherIntent",
      "slots": {}
    }
  },
  "version": "1.0"
}

Вот лямбда-ответ:

{
  "version": "1.0",
  "response": {
    "outputSpeech": {
      "type": "PlainText",
      "text": "current is ${weatherCount}"
    },
    "shouldEndSession": true
  },
  "sessionAttributes": {}
}

Разве переменная ${weatherCount} не должна уже возвращать что-то, проанализированное из JSON, вместо того, чтобы возвращаться снова как есть?

Вот новый ответ Lambda после изменения кавычек вокруг литералов шаблона на обратные кавычки (изменение «${weatherCount}» на ${weatherCount} ), так что мы можем быть на что-то!:

{
  "version": "1.0",
  "response": {
    "outputSpeech": {
      "type": "PlainText",
      "text": "current is [object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]"
    },
    "shouldEndSession": true
  },
  "sessionAttributes": {}
}

Теперь работает! Ключевым моментом было изменить кавычки, окружающие литералы шаблона, на обратные кавычки. Вот новый лямбда-запрос и новый лямбда-ответ.

Запрос лямбды:

{
  "session": {
    "sessionId": "SessionId.9f8cc454-110f-4610-a7fe-cd0918fd804f",
    "application": {
      "applicationId": "amzn1.ask.skill.482872e5-20a2-4230-bce4-a06b212443e5"
    },
    "attributes": {},
    "user": {
      "userId": "amzn1.ask.account.AFOFPAF44SZKQRQDFH3FW7PZCVEZPXLLPPWT7CO76Z62I2DVI5EFTYSFD3YMEA56R4ACYUSPTPVFGCA2BCFJCNBVLBNWAWSIOCXHCDTW5UM5WNIRE6K35XZ67CM3W2DN3NLIPRVEFWBZ3D6ASD37EYJWBQQFOK4FXB5NMGQCLJVGBJKUJMCZXVEHXU74KLSDXOV5MIF3UZPFLRA"
    },
    "new": true
  },
  "request": {
    "type": "IntentRequest",
    "requestId": "EdwRequestId.229831d9-3bd1-4173-a1c4-7664994a1a77",
    "locale": "en-US",
    "timestamp": "2017-02-28T02:39:30Z",
    "intent": {
      "name": "getWeatherIntent",
      "slots": {}
    }
  },
  "version": "1.0"
}

новый лямбда-ответ:

{
  "version": "1.0",
  "response": {
    "outputSpeech": {
      "type": "PlainText",
      "text": "current is 1"
    },
    "shouldEndSession": true
  },
  "sessionAttributes": {}
}

person Marcode777    schedule 27.02.2017    source источник
comment
Блин, может кто знает или знает в чем может быть дело?   -  person Marcode777    schedule 27.02.2017
comment
Можете ли вы вставить свою схему намерений?   -  person Anthony Neace    schedule 28.02.2017
comment
Привет @AnthonyNeace. Большое спасибо за ответ, так как я все еще пытаюсь понять это. Ниже приведена схема моего намерения: { намерения: [ { намерение: getWeatherIntent } ] }   -  person Marcode777    schedule 28.02.2017
comment
Любая дополнительная информация, которую вы можете предоставить, например информация об отладке или журналы cloudwatch (console.log выводит на cw в лямбда), также будет полезна.   -  person Anthony Neace    schedule 28.02.2017
comment
эй @AnthonyNeace: Я очень ценю помощь. Я отправлю лямбда-запрос и ответ на оригинал   -  person Marcode777    schedule 28.02.2017
comment
Можете ли вы проверить, какую версию nodejs использует ваша лямбда? Возможно, вы не используете версию, которая поддерживает литералы шаблонов, такие как ${weathercount}. Попробуйте обновиться до версии 4.3.2, если вы еще этого не сделали, и повторите запрос.   -  person Anthony Neace    schedule 28.02.2017
comment
Кроме того, я считаю, что вам нужно заключать литеральные строки шаблона в обратные кавычки, такие как ``, а не в кавычки или двойные кавычки. Попробуйте и это?   -  person Anthony Neace    schedule 28.02.2017
comment
Привет, @AnthonyNeace, ты определенно что-то понял, когда литералы шаблонов должны быть в обратных кавычках... Я окружил ${weatherCount} обратными галочками вот так ${weatherCount}, и ответ изменился!   -  person Marcode777    schedule 28.02.2017
comment
Хорошая работа, так держать! Что касается этого вопроса, то он становится слишком широким для стандартов stackoverflow — мы не можем всю ночь вносить правки туда-сюда. :) В целом вы на правильном пути, теперь мне кажется, что вам нужно сделать более конкретный разбор вашей переменной WeatherCount. Попробуйте привести его в строку и занести в журнал отладки, и в целом продолжайте этот шаблон отладки и решения проблем для каждой повторяющейся проблемы, с которой вы сталкиваетесь. Сначала выполните поиск и не стесняйтесь задавать отдельные вопросы для каждой уникальной проблемы, если их еще нет в Stack Overflow.   -  person Anthony Neace    schedule 28.02.2017


Ответы (1)


Мне кажется, это проблема с вашими литералами шаблонов. Литералы шаблонов должны быть заключены в обратные кавычки вместо одинарных или двойных кавычек. Замените кавычки обратными кавычками для всех строк, в которых используются литералы шаблонов.

Так например это:

"current is ${weatherCount}"

становится:

`current is ${weatherCount}`

Дополнительные советы по устранению неполадок:

  • Убедитесь, что вы используете последнюю версию узла, доступную для AWS Lambda; на момент написания этой статьи это v4.3.2. Старые версии узла не поддерживают литералы шаблонов.

  • В случае неудачи любого из этих шагов просто замените литералы шаблона переменными, чтобы исключить это как проблему.

  • Вывод console.log записывается в cloudwatch в AWS Lambda — вы можете использовать его для отладки каждого вызова вашей лямбда-функции. Дополнительная информация здесь: http://docs.aws.amazon.com/lambda/latest/dg/nodejs-prog-model-logging.html

person Anthony Neace    schedule 28.02.2017
comment
Решено! Спасибо @AnthonyNeace! - person Marcode777; 28.02.2017