我正在使用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"
答案 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()
方法)。