这是我在Google,Dialogflow和Firebase上使用Actions的第二天,我对dialogflow-name-psychic-nodejs示例(https://github.com/actions-on-google/dialogflow-name-psychic-nodejs)感到有些困惑。
该文档说它是使用实时数据库的示例,但我看不到任何使用任何数据库的明确方式... userStorage实际上是使用实时数据库的隐式方式吗?我想与一个非动作谷歌应用程序分享一些数据(简短文本),有没有办法检索存储在userStorage中的数据而没有动作谷歌库?
答案 0 :(得分:2)
看起来最新版本不使用实时数据库,因为他们用app对象中的userStorage字段替换它。
如果查看older version,您可以看到它如何使用实时数据库存储用户信息。 (请注意,有些代码还会使用Google v1 API上较旧的操作,因此您需要在版本之间进行跳转,以便真正了解如何执行此操作。)
但是,简而言之,您有一个初始化firebase-admin库的块:
const firebaseAdmin = require('firebase-admin');
firebaseAdmin.initializeApp(functions.config().firebase);
和另一个尝试根据用户ID从db中的引用获取值的块。如果有值,则使用它,否则请求权限:
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));
}
});
(这段代码有点奇怪,imho。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
});