dialogflow-name-psychic-nodejs 示例中如何使用实时数据库?
How is Realtime Database used in dialogflow-name-psychic-nodejs sample?
这是我在 Google、Dialogflow 和 Firebase 上使用 Actions 的第二天,我对 dialogflow-name-psychic-nodejs 示例 (https://github.com/actions-on-google/dialogflow-name-psychic-nodejs) 有点困惑。
文档说这是一个使用实时数据库的示例,但我看不到任何使用任何数据库的显式方式... userStorage 实际上是使用实时数据库的隐式方式吗?我想与非 actions-on-google 应用程序共享一些数据(短文本),有没有什么方法可以在没有 actions-on-google 库的情况下检索存储在 userStorage 中的数据?
最新版本似乎没有使用实时数据库,因为他们将其替换为应用对象中的 userStorage 字段。
如果你看一个older version,你可以看到它是如何使用实时数据库来存储用户信息的。 (请注意,某些代码还在 Google v1 API 上使用较旧的 Actions,因此您需要在版本之间跳转才能真正理解如何做到这一点。)
简而言之,您有一个初始化 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()
方法 returns 是一个承诺,因此没有必要以这种方式包装它。我会做类似的事情:
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
});
这是我在 Google、Dialogflow 和 Firebase 上使用 Actions 的第二天,我对 dialogflow-name-psychic-nodejs 示例 (https://github.com/actions-on-google/dialogflow-name-psychic-nodejs) 有点困惑。
文档说这是一个使用实时数据库的示例,但我看不到任何使用任何数据库的显式方式... userStorage 实际上是使用实时数据库的隐式方式吗?我想与非 actions-on-google 应用程序共享一些数据(短文本),有没有什么方法可以在没有 actions-on-google 库的情况下检索存储在 userStorage 中的数据?
最新版本似乎没有使用实时数据库,因为他们将其替换为应用对象中的 userStorage 字段。
如果你看一个older version,你可以看到它是如何使用实时数据库来存储用户信息的。 (请注意,某些代码还在 Google v1 API 上使用较旧的 Actions,因此您需要在版本之间跳转才能真正理解如何做到这一点。)
简而言之,您有一个初始化 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()
方法 returns 是一个承诺,因此没有必要以这种方式包装它。我会做类似的事情:
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
});