Alexa Skill - NodeJS, не работает API-вызов с запросом и обратным вызовом - PullRequest
0 голосов
/ 04 марта 2019

Я работаю над навыком Alexa. В одном из своих намерений я делаю запрос get, используя библиотеки запросов.Я передаю функцию обратного вызова для обработки ответа, однако, если я делаю responsebuilder.speak внутри функции обратного вызова, это не работает.Если я помещу responsebuilder.speak за пределы обратного вызова, он будет работать, но он будет выполнен до того, как мой ответ будет готов.

При этом я получаю ошибку ниже: "message": "SpeechletResponse was null" Это имеет смысл, так как я думаю, что это должно быть за пределами функции обратного вызова, но как я могу заставить alexa говорить ответ на вызов после его завершения, если я не могу сделать это в рамках обратного вызова, я пробовал подобное выше, используя .then по запросу-обещанию.

const myTestIntent_Handler =  {
    canHandle(handlerInput) {
        const request = handlerInput.requestEnvelope.request;
        return request.type === 'IntentRequest' && request.intent.name === 'getPsGames' ;
    },
        handle(handlerInput) {
        const request = handlerInput.requestEnvelope.request;
        const responseBuilder = handlerInput.responseBuilder;
        let sessionAttributes = handlerInput.attributesManager.getSessionAttributes();
        let say = 'Hola desde prueba ';
        var finalstr = '';

        req(options2, function (error, response, body) {
            if (!error && response.statusCode == 200) {

                console.log(error + ' ' + response.statusCode);

                say = 'response valido';

                return responseBuilder
                .speak('response valido desde callback')
                .reprompt('try again, ' + say)
                .getResponse();

                console.log('final del callback');
            }
        })
    }
};

Ответы [ 2 ]

0 голосов
/ 05 марта 2019

Обработчику запроса необходимо async, а затем вы можете await для ответа и ответа обратно.

const req = require("request");
const apiRequest = () => {
  const options2 = {
    method: "GET",
    uri: "http://libgen.io/json.php?ids=1,2&fields=Title,Author,MD5" //sample request
  };
  let say = "Hola desde prueba ";
  return new Promise((resolve, reject) => {
    req(options2, function(error, response, body) {
      if (!error && response.statusCode == 200) {
        console.log(error + " " + response.statusCode);

        say = "response valido";

        resolve(say);
      }
    });
  });
};
const myTestIntent_Handler = {
   canHandle(handlerInput) {
    return (
      handlerInput.requestEnvelope.request.type === "IntentRequest" &&
      handlerInput.requestEnvelope.request.intent.name === "getPsGames"
    );
  },
  async handle(handlerInput) {
    const data = await apiRequest();
    const speechText = data;
    return handlerInput.responseBuilder
      .speak(speechText)
      .reprompt(speechText)
      .getResponse();
  }
};
0 голосов
/ 05 марта 2019

Привет, Родольфо, добро пожаловать в SO.

Вы можете сделать свою ручку асинхронной и подождать, пока обещание не будет возвращено.Затем вы возвращаете результат обратно в Alexa.Вот пример:

const getPsGames = {
  canHandle(handlerInput) {
    return (handlerInput.requestEnvelope.request.type === 'IntentRequest' &&
        handlerInput.requestEnvelope.request.intent.name === 'getPsGames');
 },
 async handle(handlerInput) {
    let say = 'Hola desde prueba ';
    await getData(url)
          .then((response) => {
            console.log(response.statusCode);
            say = 'response valido';
           })
          .catch((err) => {console.log(err)}
    let response = handlerInput.responseBuilder
    return response
        .speak(say)
        .getResponse();
  }
}

const getData = function (url) {
  return new Promise((resolve, reject) => {
    const client = url.startsWith('https') ? require('https') : require('http');
    const request = client.get(url, (response) => {
      if (response.statusCode < 200 || response.statusCode > 299) {
        reject(new Error('Failed with status code: ' + response.statusCode));
      }
      const body = [];
      response.on('data', (chunk) => body.push(chunk));
      response.on('end', () => resolve(body.join('')));
    });
    request.on('error', (err) => reject(err))
  })
};
...