Alexa技能 - NodeJS,执行带有请求和回调的API调用不起作用

问题描述 投票:0回答:2

我正在研究Alexa技能,在我的一个意图中,我正在使用请求库进行获取请求。我正在传递一个回调函数来处理响应,但是如果我在回调函数中执行responsebuilder.speak它就不起作用。如果我将responsebuilder.speak放在回调之外它可以工作,但它会在我的响应准备好之前执行。

在此我得到以下错误:“消息”:“SpeechletResponse为空”这是有道理的,因为我认为这需要在回调函数之外,但是如何在完成后如何让alexa说出呼叫响应我无法在回调中做到这一点,我在上面尝试了类似的使用.then on request-promise。

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');
            }
        })
    }
};
javascript node.js alexa alexa-skills-kit alexa-skill
2个回答
0
投票

嗨Rodolfo欢迎来到SO。

您可以将句柄设置为异步并等待,直到返回promise。然后将结果返回给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))
  })
};

0
投票

请求处理程序需要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();
  }
};
© www.soinside.com 2019 - 2024. All rights reserved.