如何在dialogflow-name-psychic-nodejs示例中使用实时数据库?



这是我在Google,Dialogflow和Firebase上玩Actions的第二天,我对dialogflow-name-psychic-nodejs示例(https://github.com/actions-on-google/dialogflow-name-psychic-nodejs)有点困惑。

该文档说这是一个使用实时数据库的示例,但我看不到任何使用任何数据库的明确方法......userStorage 实际上是使用实时数据库的一种隐式方式吗?我想与非谷歌上的操作应用程序共享一些数据(短文本),有没有办法在没有谷歌操作库的情况下检索存储在userStorage中的数据?

看起来最新版本不使用实时数据库,因为他们将其替换为应用程序对象中的 userStorage 字段。

如果您查看旧版本,您可以看到它如何使用实时数据库来存储用户信息。(请注意,某些代码还使用较旧的 Google v1 API 上的操作,因此您需要在版本之间跳转才能真正了解如何执行此操作。

但是,简而言之,您有一个初始化 firebase-admin 库的块:

const firebaseAdmin = require('firebase-admin');
firebaseAdmin.initializeApp(functions.config().firebase);

另一个块尝试根据用户 ID 从数据库中的引用中获取值。如果那里有值,它会使用它,否则它会请求权限:

firebaseAdmin.database().ref('users/' + encodeAsFirebaseKey(userId))
.once('value', function (data) {
if (data && data.val() && data.val()[firebaseKey]) {
let speechOutput = speechCallback(data.val()[firebaseKey]);
resolve(app.tell(speechOutput));
} else {
resolve(app.askForPermission('To read your mind', permission));
}
});

(恕我直言,这段代码有点奇怪。once()方法返回一个 promise,因此不需要以这种方式包装它。我会做这样的事情:

return firebaseAdmin.database()
.ref('users/' + encodeAsFirebaseKey(userId))
.once('value')
.then( data => {
if (data && data.val() && data.val()[firebaseKey]) {
let speechOutput = speechCallback(data.val()[firebaseKey]);
return app.tell(speechOutput);
} else {
return app.askForPermission('To read your mind', permission);
}
});

但我还没有测试过这段代码。

最后,在稍后,它会根据基于用户 ID 的引用保存信息:

// Save [User ID]:[{<name or location>: <data>}] to Firebase
// Note: Users can reset User ID at any time.
firebaseAdmin.database().ref('users/' + encodeAsFirebaseKey(userId)).update({
[firebaseKey]: userData
});

最新更新