алекса спрашиваю sdk v2 nodejs как выговорить массив строк в ответ - PullRequest
0 голосов
/ 23 февраля 2019

У меня проблемы с высказыванием нескольких вариантов ответа alexa.Пожалуйста, найдите код ниже:

let results = await getNearestNames(data.results[0].geometry.location.lat, data.results[0].geometry.location.lng);      
// generate response
let nearestNames = "";
results.map((obj) => {
    nearestNames += obj.name + '<break time="1s">';
});

response = responseBuilder
    .speak(nearestNames)
    .getResponse();

Вызов API getNearestNames отправляет массив в ответ.Я пытаюсь высказать каждое имя по одному.Но передача переменной nearNames в функции speak () приводит к «Проблема с ответом запрошенного навыка».Как мне решить эту проблему?

Спасибо

Ответы [ 2 ]

0 голосов
/ 26 февраля 2019

Ресурсы Alexa не дружественны для разработчиков, когда что-то пошло не так, не так ли?

Эта ошибка, вероятно, вызвана исключением, вызванным методом getNearestNames (добавьте .catch(e => console.log(e)) и проверьте вывод CloudWatch, или из-за слишкомдлительное время ответа - у вас есть всего 10 секунд, чтобы отреагировать на ввод пользователя, или вы просто не пометили метод обработчика как async. Также я не уверен, что Alexa обернет текст ответа <speak> разметками - выИспользует <break> в вашем образце.

0 голосов
/ 24 февраля 2019

Вы можете попробовать использовать приведенный ниже код для отправки нескольких ответов, он выполняет вызов API, чтобы выбрать названия книг, выполнить итерацию по нему и ответить заголовком.Он использует модуль request-обещание-native для выполнения запроса, просто чтобы показать пример.

async function getNames() {
  try {
    const options = {
      method: "GET",
      url: "http://libgen.io/json.php?ids=1,2&fields=Title,Author,MD5"
    };
    let result = await rp(options);
    result = JSON.parse(result);
    return result;
  } catch (e) {
    throw e;
  }
}

const BookNameIntentHandler = {
  canHandle(handlerInput) {
    return (
      handlerInput.requestEnvelope.request.type === "IntentRequest" &&
      handlerInput.requestEnvelope.request.intent.name === "BookIntent"
    );
  },
  async handle(handlerInput) {
    const data = await getNames();
    let names = "";
    data.map(item => {
      names += `${item.title} <break time="3s"/>`;
    });
    console.log("Names ", names);
    const speechText = `<speak> The books names are, <break time="2s"/> ${names}</speak>`;
    return handlerInput.responseBuilder
      .speak(speechText)
      .reprompt(speechText)
      .getResponse();
  }
};
...