[英]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.