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"