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

时间:2018-01-16 01:20:28

标签: actions-on-google

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

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

1 个答案:

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