Alexa 技能中的 Firebase 调用被复制
Firebase call in Alexa skill being duplicated
我有以下处理程序:
'addTask': function () {
var filledSlots = delegateSlotCollection.call(this);
var taskName = this.event.request.intent.slots.taskName.value;
var starNum = this.event.request.intent.slots.starNum.value;
var usr = this.event.session.user.userId.split(".")[3];
if (taskName && starNum && taskName !== "?" && starNum !=="?"){
db.addTask(usr, taskName, parseInt(starNum), res => {
this.emit(":tell", res);
});
}
},
所有 Firebase 功能都通过 input/output 方法进行了测试,并按预期工作。此函数预期将新任务推送到数据库,或者如果存在此类任务则添加到数量中。
这是 Firebase 代码;
addTask: (user, taskName, stars, cb) => {
var ref = db.ref("users/" + user + "/tasks");
ref.once("value").then(snapshot => {
const data = snapshot.val();
for (var task in data){
if (data[task].name === taskName){
ref.child(task).update({
name: taskName,
stars: stars,
quantity: data[task].quantity + 1
}).then(() => {
cb("This task already exists, and an instance of the task has been added.");
})
}
}
ref.push().set({
name: taskName,
stars: stars,
quantity: 1
}).then(() => {
cb("The task " + taskName + " worth " + stars + " stars has been added!");
})
}, err => console.log(err.code));
},
但是,通过Alexa使用时,发现该函数几乎在同一时间被调用了两次(有时是三次)。然而,Alexa 模拟器只会响应一次,并返回第二次调用的信息(也就是说它增加了数量)。
知道这是怎么回事,或者至少有一个 hacky 解决方案?
已修复。
原来 if (taskName && starNum)
不足以确保它是最后一次调用意图。需要检查以确保 request.dialogState
是 "COMPLETED"
而不是 "IN_PROGRESS"
。
我有以下处理程序:
'addTask': function () {
var filledSlots = delegateSlotCollection.call(this);
var taskName = this.event.request.intent.slots.taskName.value;
var starNum = this.event.request.intent.slots.starNum.value;
var usr = this.event.session.user.userId.split(".")[3];
if (taskName && starNum && taskName !== "?" && starNum !=="?"){
db.addTask(usr, taskName, parseInt(starNum), res => {
this.emit(":tell", res);
});
}
},
所有 Firebase 功能都通过 input/output 方法进行了测试,并按预期工作。此函数预期将新任务推送到数据库,或者如果存在此类任务则添加到数量中。
这是 Firebase 代码;
addTask: (user, taskName, stars, cb) => {
var ref = db.ref("users/" + user + "/tasks");
ref.once("value").then(snapshot => {
const data = snapshot.val();
for (var task in data){
if (data[task].name === taskName){
ref.child(task).update({
name: taskName,
stars: stars,
quantity: data[task].quantity + 1
}).then(() => {
cb("This task already exists, and an instance of the task has been added.");
})
}
}
ref.push().set({
name: taskName,
stars: stars,
quantity: 1
}).then(() => {
cb("The task " + taskName + " worth " + stars + " stars has been added!");
})
}, err => console.log(err.code));
},
但是,通过Alexa使用时,发现该函数几乎在同一时间被调用了两次(有时是三次)。然而,Alexa 模拟器只会响应一次,并返回第二次调用的信息(也就是说它增加了数量)。
知道这是怎么回事,或者至少有一个 hacky 解决方案?
已修复。
原来 if (taskName && starNum)
不足以确保它是最后一次调用意图。需要检查以确保 request.dialogState
是 "COMPLETED"
而不是 "IN_PROGRESS"
。