【问题标题】:Firebase: How to read from external DB?Firebase:如何从外部数据库读取?
【发布时间】:2019-04-21 03:15:58
【问题描述】:

我在另一台服务器上的 PostgreSQL 中有一些数据,我需要读取这些数据以包含在我的 Firebase 应用程序中,然后渲染图表。我只有数据库连接字符串,没有端点可以返回该数据。

  • 我会在 Firebase 上使用身份验证和角色将连接字符串限制为管理员。

  • 然后我需要一种方法让 Firebase 应用程序使用 SQL 获取该数据并在客户端上显示,这将呈现表格和图表。

  • 用户应该永远看不到连接字符串,即使在网络流量中也是如此。

这可行吗?如何实现?

【问题讨论】:

  • 这里的问题是你为什么要这样做?您已经在 SQL 数据库中获得了数据,并且可以生成表格和图表。 a)您为什么要将这些数据移动到 Firebase ......即有什么优势/用例。 b) 您是否有将 SQL 表重构为 JSON 对象的计划?是否考虑加入或其他 SQL 函数(搜索等)。
  • @Jay 我想在 Firebase 上构建一个面向客户的应用程序,他们可以在其中注册,每个客户都可以做某些事情,其中​​包括在表格和图表中查看来自 Postgres 的数据。所以我会使用 Firebase 的 NoSQL 来处理除了 PG 上已经存在的那段数据之外的所有内容。
  • 好的 - 所以您实际上不需要将任何 SQL 数据从 SQL 迁移到 Firebase。如果我理解正确,您只需要查看图表中的结果数据。事情从那里变得有点空洞,因为我们不知道“数据库连接字符串”是什么,而且也不知道结果数据集是什么/在哪里/如何存储的。它可以作为平面文件下载还是存储在另一个 SQL 表中。我认为您需要使用更多数据来增强您的问题才能真正了解范围。
  • 数据库连接字符串为标准格式 username:password@host:port/dbname。数据存储为任何其他数据,在表中,可以通过 SQL 或某些适配器、ORM 等检索。
  • 由于 Firebase 没有服务器端代码,您将无法直接让 Firebase 获取 SQL 数据 - 它必须通过客户端。您可以加密网络字符串,但这无济于事,因为客户端仍然必须连接到 SQL 服务器。将数据存储在 Firebase 中而不使用 SQL 服务器会怎样?

标签: postgresql firebase firebase-realtime-database


【解决方案1】:

我有一个类似的问题要解决,作为临时解决方案,我使用 firebase admin serviceAccount 初始化了应用程序。然后在我的服务器上监听 firebase 集合的变化,并在收到的新值上插入\更新 PostgreSQL 中的值。

以管理员身份初始化应用并监听 firebase 上的变化:

  admin.initializeApp({
    credential: admin.credential.cert(serviceAccount),
    databaseURL: 'https://yourfirebaseproject.firebaseio.com',
  });

  const db = admin.database();

  db.ref('User').on('value', async (snapshot) => {
    insertOrUpdate(User, 'users', snapshot.val());
  });

将数据插入\更新到 PostgreSQL:

const insertOrUpdate = (model, tableName, data) => {
  const firstData = data[0] ? data[0] : data;

  return model.knex().raw(
    knex(tableName).insert(data).toQuery() + ' ON CONFLICT ("id") DO UPDATE SET ' +
      Object.keys(firstData).map((field) => `${field}=EXCLUDED.${field}`).join(', ')
  );
};

【讨论】:

    【解决方案2】:

    Firebase 没有“与 PostgreSQL 同步”API。

    因此,要么您的应用需要执行此操作(这意味着它可以访问 PostgreSQL 和 Firebase 数据库),要么您需要设置一个服务器来执行此操作。

    由于您已经裁定应用无法知道 PostgreSQL 连接字符串,因此只能在服务器(或一般用户无权访问的其他地方)上执行此操作。

    除此之外,场景非常广泛。实现它的方法有很多很多。

    【讨论】:

    • 问题是 Firebase 没有服务器代码的选项。在那种情况下会很容易。现在看来不可能了。
    • 我们知道,允许您在 Firebase 的服务器上运行代码将允许更多人在不需要服务器的情况下实现他们的用例。我还从经验中得知,大多数开发人员都高估了运行需要提升权限的代码(例如您的代码)的意义。它可以是一个很小的虚拟机/容器,也可以是你家里的一个盒子,我经常开玩笑说它甚至可以是你自己的安卓手机。在这种情况下,客户端和服务应用程序之间的区别在于,其中一个是 your Android 手机,另一个是 my Android 手机”。这是关于信任,而不是关于计算能力。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-23
    • 1970-01-01
    • 1970-01-01
    • 2021-07-18
    • 1970-01-01
    相关资源
    最近更新 更多