Lambda 函数未返回对 Alexa 技能的响应
Lambda function not returning response to Alexa skill
我有一个用 Nodejs 编写的用于 Alexa 技能的 Lambda 函数。它对服务进行 HTTP 调用,并将 returns 输出到 Alexa Skill。调用技能时,将调用 lambda,并进行 HTTP 调用。但是,在返回 HTTP 响应之前,lambda returns,因此该技能没有得到答案。
下面是我的 Lambda 函数
var Alexa = require('ask-sdk');
var http = require('http');
var SKILL_NAME = 'Some Facts';
var GetNewFactHandler = {
canHandle(handlerInput) {
var request = handlerInput.requestEnvelope.request;
return request.type === 'LaunchRequest'
|| (request.type === 'IntentRequest'
&& request.intent.name === 'GetNewFactIntent');
},
handle(handlerInput) {
getTop("", (data)=>{
let speechOutput = "The result is " + data;
console.log("resp from lambda ", speechOutput)
var respSpeak = handlerInput.responseBuilder
.speak(speechOutput)
.withSimpleCard(SKILL_NAME, data)
.getResponse();
console.log("respSpeak ", respSpeak);
return respSpeak;
});
},
};
function getTop(query, callback) {
var options = {
host: 'somehost',
port: '8100',
path: '/top',
method: 'GET',
};
var req = http.request(options, res => {
res.setEncoding('utf8');
var responseString = "";
res.on('data', chunk => {
responseString = responseString + chunk;
});
res.on('end', () => {
console.log("********",JSON.parse(responseString).Name);
let respStr = JSON.parse(responseString).Name;
callback(respStr);
});
});
req.end();
}
在 lambda 日志中,我可以看到 getTop() 中的日志。但是在接收到 HTTP 调用的响应之前,lambda returns 的响应。我在想,在回调中构建响应将确保仅在 HTTP 调用完成后才返回响应。但事实似乎并非如此。这怎么能解决?感谢任何帮助。
Node.js 默认是 asynchronous,这意味着你的响应生成器在服务返回数据之前被调用。
我在调用客户资料 api 获取 phone 号码时遇到了类似的问题,我使用 async-await 解决了这个问题
async handle(handlerInput) {
const { serviceClientFactory, responseBuilder } = handlerInput;
try {
const upsServiceClient = serviceClientFactory.getUpsServiceClient();
const profileMobileObject = await upsServiceClient.getProfileMobileNumber();
const profileMobile = profileMobileObject.phoneNumber;
const speechResponse = `Hello your mobile number is, ${profileMobile}</say-as>`;
const cardResponse = `Hello your mobile number is, ${profileMobile}`
return responseBuilder
.speak(speechResponse)
.withSimpleCard(APP_NAME, cardResponse)
.getResponse();
} catch (error) {
console.log(JSON.stringify(error));
if (error.statusCode == 403) {
return responseBuilder
.speak(messages.NOTIFY_MISSING_PERMISSIONS)
.withAskForPermissionsConsentCard([MOBILE_PERMISSION])
.getResponse();
}
console.log(JSON.stringify(error));
const response = responseBuilder.speak(messages.ERROR).getResponse();
return response;
}
},
创建函数 async 并在调用 service 之前使用 await。
您也可以通过 Promises
我有一个用 Nodejs 编写的用于 Alexa 技能的 Lambda 函数。它对服务进行 HTTP 调用,并将 returns 输出到 Alexa Skill。调用技能时,将调用 lambda,并进行 HTTP 调用。但是,在返回 HTTP 响应之前,lambda returns,因此该技能没有得到答案。
下面是我的 Lambda 函数
var Alexa = require('ask-sdk');
var http = require('http');
var SKILL_NAME = 'Some Facts';
var GetNewFactHandler = {
canHandle(handlerInput) {
var request = handlerInput.requestEnvelope.request;
return request.type === 'LaunchRequest'
|| (request.type === 'IntentRequest'
&& request.intent.name === 'GetNewFactIntent');
},
handle(handlerInput) {
getTop("", (data)=>{
let speechOutput = "The result is " + data;
console.log("resp from lambda ", speechOutput)
var respSpeak = handlerInput.responseBuilder
.speak(speechOutput)
.withSimpleCard(SKILL_NAME, data)
.getResponse();
console.log("respSpeak ", respSpeak);
return respSpeak;
});
},
};
function getTop(query, callback) {
var options = {
host: 'somehost',
port: '8100',
path: '/top',
method: 'GET',
};
var req = http.request(options, res => {
res.setEncoding('utf8');
var responseString = "";
res.on('data', chunk => {
responseString = responseString + chunk;
});
res.on('end', () => {
console.log("********",JSON.parse(responseString).Name);
let respStr = JSON.parse(responseString).Name;
callback(respStr);
});
});
req.end();
}
在 lambda 日志中,我可以看到 getTop() 中的日志。但是在接收到 HTTP 调用的响应之前,lambda returns 的响应。我在想,在回调中构建响应将确保仅在 HTTP 调用完成后才返回响应。但事实似乎并非如此。这怎么能解决?感谢任何帮助。
Node.js 默认是 asynchronous,这意味着你的响应生成器在服务返回数据之前被调用。 我在调用客户资料 api 获取 phone 号码时遇到了类似的问题,我使用 async-await 解决了这个问题
async handle(handlerInput) {
const { serviceClientFactory, responseBuilder } = handlerInput;
try {
const upsServiceClient = serviceClientFactory.getUpsServiceClient();
const profileMobileObject = await upsServiceClient.getProfileMobileNumber();
const profileMobile = profileMobileObject.phoneNumber;
const speechResponse = `Hello your mobile number is, ${profileMobile}</say-as>`;
const cardResponse = `Hello your mobile number is, ${profileMobile}`
return responseBuilder
.speak(speechResponse)
.withSimpleCard(APP_NAME, cardResponse)
.getResponse();
} catch (error) {
console.log(JSON.stringify(error));
if (error.statusCode == 403) {
return responseBuilder
.speak(messages.NOTIFY_MISSING_PERMISSIONS)
.withAskForPermissionsConsentCard([MOBILE_PERMISSION])
.getResponse();
}
console.log(JSON.stringify(error));
const response = responseBuilder.speak(messages.ERROR).getResponse();
return response;
}
},
创建函数 async 并在调用 service 之前使用 await。 您也可以通过 Promises