【问题标题】:Update client data on database update在数据库更新时更新客户端数据
【发布时间】:2018-04-05 12:43:59
【问题描述】:

我正在使用 ReactJS + Relay + GraphQL + MongoDb 构建我的第一个 SaaS B2C 应用程序。例如,应用程序将具有以下对象:

  • 用户
  • 客户
  • 库存项目
  • 库存水平
  • 价目表
  • 销售
  • 退货

对于每个对象,我可以查看其列表(例如:库存物品列表 - StockItem 列表),以及对象的详细信息。可以创建、编辑或删除对象 (CRUD)。

使用 REST,我将为每个对象构建一个数据获取器。因此,一旦用户去列出销售,即客户端将去服务器并获取所有可用的销售。如果用户单击详细信息,则会进行新的 REST 调用以获取此特定的销售详细信息,依此类推。

使用 GraphQL 我知道我应该创建一个大的viewer 查询,将所有这些对象和字段连接到应用程序,并使用片段来访问每个对象的它们。

这样做,我无法理解如果另一个用户更改某个对象会发生什么,因为所有数据将在应用程序开始时立即加载。一旦打开一个新屏幕,Relay 会重新加载片段,其工作方式与使用 REST 完成的方式相同吗?我应该建立一个更新机制吗?如果是这样,有什么方法可以走。

记住我有 40 多个不同的对象

或者我可能需要像使用 REST 一样为每个对象构建一个查询?

【问题讨论】:

  • 我之前没有使用过 GraphQL 或 Relay,所以我不了解它们,但我认为您需要找出某种 Pub/Sub 逻辑来通知用户数据已更改。 MongoDb Oplog 记录对数据库进行的每个操作。您可以监听这些操作,如果相关数据被其他用户更改,您可以在其他用户浏览器上刷新数据。我相信 Meteor 使用了类似的方法。
  • 有没有一种简单的方法可以做到这一点,否则我目前拥有的 40 多个对象会很疯狂。
  • 恐怕我什么都不知道

标签: reactjs graphql relayjs


【解决方案1】:

是的,您需要为每个对象构建一个查询。

使用中继调用 <QueryRenderer /> 查询。
每次您想批量查询某些内容时,都会有一个 <QueryRenderer /> 与查询相关联。

例如,假设有 2 个页面:/users/sales,它们都是列表。

/users 可以在某处渲染:

<QueryRenderer
  environment={...}
  query={graphql`
    query UsersPageQuery {
      users(first: 10) {
        edges { node {
          ...UsersPage_user
        }}
      }
    }
  `
  // ... others props
/>

/sales 可以在某处渲染:

<QueryRenderer
  environment={...}
  query={graphql`
    query SalesPageQuery {
      sales(first: 10) {
        edges { node {
          ...SalesPage_sale
        }}
      }
    }
  `
  // ... others props
/>

不要一次加载所有数据。
一个好主意是每个视图都有一个&lt;QueryRenderer /&gt;,例如列表或项目详细信息视图。与 REST 中的拆分相同;)

【讨论】:

  • 举个例子,我需要一个&lt;QueryRenderer /&gt; 代表Users(返回所有用户的主要属性列表 - 例如:姓名、电子邮件、电话),一个&lt;QueryRenderer /&gt; 代表User(id) (某个用户传递其 id 并返回其所有详细信息:姓名、电子邮件、电话、地址、城市、邮编、社会保障、上次购物等)。如果我有 40 个对象,我将有大约 80 个查询(一个用于对象列表,一个用于对象详细信息)。是这个主意吗?我担心使用太多查询,并正在寻找一种方法来减少它们....
猜你喜欢
  • 1970-01-01
  • 2018-09-28
  • 1970-01-01
  • 2011-12-22
  • 2015-02-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多