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
  });