DialogFlow内联编辑器无法通过if语句设置响应

时间:2018-10-17 16:18:08

标签: javascript dialogflow

我正在使用DialogFlow进行项目,其中一部分是将用户注册到数据库,该数据库的工作方式应该与它相同,但是我正在检查数据库中是否已存在UID,并且应该检查用户是否已警告,但这不起作用。 console.log()消息将使用正确的信息传递给firebase,但它不会对DialogFlow做出任何响应,在这种情况下,message将是响应。

这是我的注册用户代码:

  function registerUser(agent) {

    let added = false;
    let message = "Not used";
    ref.child(uid).once("value", function(snapshot) {
        if (snapshot.val() === null) {
            ref.child(uid).set({
                FIRST_NAME: firstName,
                LAST_NAME: lastName
            });
            added = true;
        }
    }).then(doc => {
        if (added === true) {
            message = "Great! You are now added to the database";
            console.log("User_added_success");
        }
        else {
            message = "User aldready exists!";
            console.log("User_added_fail");
        }
    });
    agent.add(message); 
  }

输出为"Not used"作为响应,console.log()为"user_added_success"

1 个答案:

答案 0 :(得分:1)

您有一些与如何使用Promises有关的问题。 Firebase数据库和Firebase Cloud Functions使用约定来处理node.js中的异步操作。在现代的node.js中,Promises在很大程度上优于回调。

第一个问题是,处理来自Firebase的响应时,您似乎混合了回调和Promises。由于once()可以返回Promise,因此您不需要使用回调,而可以将其作为.then()块的一部分。这可能看起来像这样:

.once("value").then( snapshot => {
    if (snapshot.val() === null) {
        ref.child(uid).set({
            FIRST_NAME: firstName,
            LAST_NAME: lastName
        });
        added = true;
    }
    return snapshot;
})

第二个问题是,通过Promise履行设置的任何内容都必须在Promise链的后续部分中读取。因此,就像您在第一个added函数中设置then()并在第二个函数中读取它一样,如果您在第二个函数中设置message,则需要在{ {1}}子句或后面的then()子句。由于没有其他异步操作,您可以在if / else子句之后执行此操作。也许是这样的:

then()

但是,最后一个问题涉及承诺。如果您正在使用异步调用(因此使用了Promises),则还必须从Intent Handler返回Promise,以便Dialogflow库知道在将结果发送回用户之前要等待结果。尚不清楚这是否是处理程序本身,但如果是,则处理此问题的最简单方法是返回Promise链的结果。由于Firebase数据库调用返回了Promise,所以这部分可以很简单

    if (added === true) {
        message = "Great! You are now added to the database";
        console.log("User_added_success");
    }
    else {
        message = "User aldready exists!";
        console.log("User_added_fail");
    }
    agent.add( message );

(之后是上面讨论的return ref.child(uid) .once()方法)。