【问题标题】:FeathersJS with Firebase architecture带有 Firebase 架构的 FeathersJS
【发布时间】:2017-01-13 07:56:15
【问题描述】:

我有一个现有的 Firebase 应用程序(它是为快速原型设计而构建的,现在已经变得越来越大,我不打算移动,因为现有的依赖关系以及易用性和身份验证捆绑在一起)并且我正在尝试构建使用 FeatherJS 的 Rest API。

如果您使用的是标准数据库(MongoDB 等),使用 FeathersJS 似乎真的很容易。 如何将 Firebase 与 Feathers 集成以保持最佳实践(服务架构、AOP)?我可以覆盖 Feathers 中的服务并将其映射到我的 Firebase Rest 端点吗?

我在 Feathers 中创建了一个自定义服务并尝试这样做:

  get(id, params) {
    return Promise.resolve(FirebaseRef.child(id).once('value'));
  }

我明白了:

Converting circular structure to JSON error

我做的对吗?

【问题讨论】:

  • 我也很感兴趣,如果有一种优雅的方式将 Firebase 与 FeathersJS 集成,就像你建议的那样。因此,我开始赏金。

标签: node.js firebase-realtime-database architecture promise feathersjs


【解决方案1】:

这行得通:

return Promise.resolve(FirebaseRef.child('userId1').once('value').then(function (snap) {
          return snap.val();
        }));

我仍然不确定这是否是我将 Firebase 与 FeathersJs 集成的最佳方式

【讨论】:

  • 不太确定 Firebase 与 FeathersJs 的集成,但 FirebaseRef.child(id).once('value') 肯定会返回一个承诺,而无需包裹在 Promise.resolve() 中?如果是这样,那么你可以写return FirebaseRef.child('userId1').once('value').then((snap) => snap.val());
  • 您好,按照您的方法,我尝试这样做: FirebaseRef.push(data).then( (reference) => reference.once('value').then( (snap) => snap.val ()));而不是 Promise.resolve(FirebaseRef.push(data).then(function (reference) { return reference.once('value').then(function (snapshot) { return snapshot.val(); }); })) ;推送完成后调用 get 卡住了你能告诉我我在链接两个调用时做错了什么吗?
  • 承诺链构建方式的灵活性将允许您将表达式“展平”为FirebaseRef.push(data).then((reference) => reference.once('value')).then((snap) => snap.val()); - 仔细观察并注意这里第一个.then() 在第二个.then() 开始之前关闭。这样做的视觉影响远小于缩进块函数{}。
  • 这很酷,是的,我有第二个 .then( 在第一个里面,但现在已经改为链接它们
【解决方案2】:

Firebase 和 Feathers 实时之间的主要架构区别在于 Firebase 使用键值观察,而 Feathers 使用 real-time events,您在关注 REST architecture 时会自动获得。第一步是将通用 Firebase 操作包装在它自己的 custom service 中,看起来像这样(未经测试):

class FirebaseService {
  constructor(name) {
    this.name = name;
  }

  ref(id) {
    return firebase.database().ref(`${this.name}/${id}`);
  }

  async get(id) {
    const ref = await this.ref(id).once('value');

    return ref.value;
  }

  async create(data) {
    const id = firebase.database().ref().child(`/${this.name}`).push().key;

    return this.update(id, data);
  }

  async update(id, data) {
    this.ref(id).set(data);

    return this.get(id);
  }

  async remove(id) {
    const deletedEntry = await this.get(id);

    this.ref(id).remove();

    return deletedEntry;
  }
}

这将为您提供一个 Feathers Firebase 集成,只要您通过 Feathers API 使用它,它就会自动发送real-time events。如果 Firebase 在服务之外得到更新并且您想通知客户端,您可以使用值侦听器并在服务器上的服务上调用 update 和/或 patch

const id = <some user id>;
firebase.database().ref(`/users/${id}`).on('value', snapshot => {
  app.service('users').update(id, snapshot.value);
});

【讨论】:

  • - Firebase 也将自己定位为“实时数据库”。这里有什么区别? - 你建议的方法有什么缺点吗? - Firebase 的一个重要方面是它打开一个直接的 WebSocket 连接来传输数据。在上面的示例中,数据通过 Feathers 服务器代理。是否也可以通过 Feathers Service 实例化一些 WebSocket,所有进一步的数据都直接在客户端和 Firebase 之间发送,而无需进一步的 Feathers Service 交互?
  • 我展示的实现不必在 Feathers 服务器上,它也可以在 Feathers 客户端(和直接连接)中工作。不同的是,Feathers 是一个更加开放和灵活的alternative to Firebase。您可以像我展示的那样在服务中将 Firebase 视为普通数据库,但除此之外,如果您不想同时与两者作战,它实际上归结为致力于其中一个。
  • Feathers 旨在作为 Firebase 前面的 API 层。这个抽象层应该隐藏某些东西,负责权限控制,但同时提供 Firebase 的(实时)功能。
  • 因此将所有 API 实现暴露给客户端不是一种选择。
  • 我不是这么说的。我说如果你只在客户端上使用 Feathers 并让它直接连接到 Firebase(而不是 Feathers 服务器)是可能的。
猜你喜欢
  • 2018-09-22
  • 1970-01-01
  • 2016-12-08
  • 2013-03-03
  • 2011-11-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-06-06
相关资源
最近更新 更多