sách gpt4 ai đã đi

node.js - Lambda 函数未返回对 Alexa 技能的响应

In lại 作者:太空宇宙 更新时间:2023-11-04 03:18:57 25 4
mua khóa gpt4 Nike

我有一个用于 Alexa 技能的 Lambda 函数,它是用 Nodejs 编写的。它对服务进行 HTTP 调用并将输出返回到 Alexa Skill。调用技能时,将调用 lambda,并进行 HTTP 调用。然而,在 HTTP 响应返回之前,lambda 返回,因此该技能无法得到答案。

下面是我的 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() 中的日志。但 lambda 的响应会在收到 HTTP 调用的响应之前返回。我认为在回调中构建响应将确保仅在 HTTP 调用完成后返回响应。但事实似乎并非如此。如何解决这个问题?如有任何帮助,我们将不胜感激。

1 Câu trả lời

Node.js 默认情况下是异步,这意味着您的响应构建器会在服务返回数据之前被调用。我在调用客户个人资料 api 获取电话号码时遇到了类似的问题,我使用 async-await 解决了这个问题,如下

async handle(handlerInput) {
const { serviceClientFactory, responseBuilder } = handlerInput;
thử {
const upsServiceClient = serviceClientFactory.getUpsServiceClient();
const profileMobileObject = await upsServiceClient.getProfileMobileNumber();

const profileMobile = profileMobileObject.phoneNumber;
const speechResponse = `Hello your mobile number is, ${profileMobile}`;
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;
}
},

在调用Phục vụ之前,使函数异步và sử dụngawait。您也可以通过 Promises 执行此操作

关于node.js - Lambda 函数未返回对 Alexa 技能的响应,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52745444/

25 4 0
Bài viết được đề xuất: c - 根据 int 对结构数组进行排序
Bài viết được đề xuất: python - 检查登录状态 flask
Bài viết được đề xuất: c - VS 2017 + cmake + 忍者 + mingw
Bài viết được đề xuất: javascript - Node js Stripe 收到未知参数 : dob
太空宇宙
Hồ sơ cá nhân

Tôi là một lập trình viên xuất sắc, rất giỏi!

Nhận phiếu giảm giá Didi Taxi miễn phí
Mã giảm giá Didi Taxi
Giấy chứng nhận ICP Bắc Kinh số 000000
Hợp tác quảng cáo: 1813099741@qq.com 6ren.com