我在lambda函数中有以下代码
var objectData = [];
"GetResearchBlogIntent" : function(){
var bucketParams = {
Bucket: "etfs-alexa-app",
Key: "researchBlogs/IndonesiaSecuresMajorityStakeInGrasbergMine.txt"
}
s3.getObject(bucketParams, function(err, data){
if (err){
console.info( "Error", err);
}
else{
objectData.push(data.Body.toString("utf-8"));
}
})
this.emit(":ask", objectData )}
这将在您第一次运行时返回任何内容,但无论您运行多少次都将从on s3中的文本文件返回正确的信息,除非您完全重置它。
我不明白如何让lambda等待s3.getObject获取信息。
我试过了:
"GetResearchBlogIntent" : function(){
var bucketParams = {
Bucket: "etfs-alexa-app",
Key: "researchBlogs/IndonesiaSecuresMajorityStakeInGrasbergMine.txt"
}
s3.getObject(bucketParams, function(err, data){
if (err){
console.info( "Error", err);
}
else{
objectData.push(data.Body.toString("utf-8"));
console.info("4")
context.succeed()
}
})
this.emit(":ask", objectData )
}
但我不认为我这样做是正确的,因为它只是给了我没有定义的错误上下文,它在这里:
exports.handler = (event, context, callback) => {
var alexa = Alexa.handler(event, context, callback);
alexa.registerHandlers(handlers);
alexa.execute();
};
我也尝试使用回调,但在使用SDK库时我不确定正确的语法。
答案 0 :(得分:0)
您遇到异步问题。当emit
甚至没有开始时,您正在致电getObject
,这就是为什么您有空object
的原因。
调用getObject
内的发射。
s3.getObject(bucketParams, (err, data) => {
if (err) {
// ...
} else {
objectData.push(data.Body.toString("utf-8"));
context.succeed();
this.emit(":ask", objectData);
}
});
将getObject
包裹在function
内,然后在结尾处调用emit
。