簡體   English   中英

Alexa Skill-NodeJS,使用請求和回調進行API調用不起作用

[英]Alexa Skill - NodeJS , Doing an API call with request and callback is not working

我正在研究Alexa技能,出於一種目的,我正在使用請求庫進行獲取請求。 我正在傳遞一個回調函數來處理響應,但是,如果我在回調函數中執行responsebuilder.speak,它將無法正常工作。 如果我將responsebuilder.speak放在回調之外,它可以工作,但是它將在我的響應准備好之前執行。

在此我得到下面的錯誤:“ message”:“ SpeechletResponse為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');
            }
        })
    }
};

您好Rodolfo歡迎來到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))
  })
};

請求處理程序需要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();
  }
};

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM