我在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 )}
第一次运行时,这将一无所获,但是无论您运行多少次,除非您完全重置它,否则将从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库时不确定正确的语法。
您正在遇到异步问题。当getObject
甚至没有启动时,您正在调用emit
,这就是为什么您获得空的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
。