【问题标题】:How to use global ID?如何使用全局 ID?
【发布时间】:2016-12-14 13:05:00
【问题描述】:

id 在每次加载时都不同时,我应该如何(重新)查询对象? 我错过了什么?

const {nodeInterface, nodeField} = nodeDefinitions(
  (globalId) => {
    const {type, id} = fromGlobalId(globalId);

    // This id is different every time (if page is reloaded/refreshed)
    // How am I suppose to use this id for database query (e.g by id)?
    // How do I get "the right ID"? (ID actually used in database)
    console.log('id:', id);

    // This is correct: "User"
    console.log('type:', type);

    if (type === 'User') {
        // Function that is suppose to get the user but id is useless ..
        return getUserById(id);
    } 
    return null;
  },

  (obj) => {
    if (obj instanceof User) {
        return userType;
    } 
    return null;
  }
);

const userType = new GraphQLObjectType({
  name: 'User',
  fields: () => ({
      id: globalIdField('User'),      // Relay ID
      _id:   { type: GraphQLString }, // MongoDB ID
      email: { type: GraphQLString },
      name:  { type: GraphQLString }    
  }),
  interfaces: [nodeInterface]
});

【问题讨论】:

  • 为什么您的id 会在每次重新加载时更改? id 由服务器设置,因此它可以(并且应该)在重新加载时保持一致。 fromGlobalId 函数只是将id 字段从getUserById 函数返回的对象中取出,并将其与"User" 字符串合并
  • @NevilleS 重新加载时不一样..知道可能是什么原因吗?
  • 它在哪里“改变”了?你的意思是,在 React 客户端代码中?如果是这样,当您应该使用服务器返回的合法 ids 时,您可能只是在客户端任意发明 ids
  • @NevilleS 首先它是如何生成全局 ID 的?数据库 ID 是如何到达那里的(我应该能够在数据库查询中检索和使用它)?我给它的只是id: globalIdField('User')_id 是真正的交易(数据库中的对象ID)。

标签: reactjs relayjs graphql-js


【解决方案1】:

全局 ID 主要用于重新获取已经在 Relay 客户端存储中的对象。我将 DRY 并指向an excellent related SO post,它很好地解释了如何在 Relay 中使用全局 ID。

如果您使用库中的辅助函数,例如 JavaScript 中的 graphql-relay-js,则处理全局 ID 变得非常简单:

  1. 您决定服务器端对象类型 X 对应于 GraphQL 对象类型 Y。
  2. 向 X 添加一个字段 id。这个 id 是本地 ID,它对于任何类型 X 的对象都必须是唯一的。如果 X 对应于 MongoDB 文档类型,那么一个简单的方法是分配字符串_id 到这个 id 字段的表示:instanceOfX.id = dbObject._id.toHexString()
  3. 使用globalIdField 辅助函数将字段id 添加到Y。 id 是全局 ID,它在所有类型和对象中都是唯一的。如何生成这个全局唯一 ID 字段取决于实现。 globalIdField 辅助函数从对象 X 中的 id 字段和类型名称 X 生成此。
  4. nodeDefinitions 中,使用fromGlobalId 辅助函数从全局ID 中检索本地ID 和类型。由于 X 中的 id 字段是 MongoDB 中的 _id 字段,因此您可以使用此本地 ID 执行 DB 操作。首先从十六进制字符串转换为 MongoDB ID 类型。

本地 ID 分配(第 2 步)必须在您的实施中中断。否则,同一对象的 ID 不会在每次重新加载时都不同。

【讨论】:

  • 谢谢,您提到了理解这一点的关键。我已经阅读了文档和很多很多帖子,但从来没有清楚地说全局 ID 是由您给定的string + 返回的id 形成的(它实际上必须是id,不能是任何东西否则)。我的问题是我在数据库模型中使用了我自己的 id_id 并且 Relay 很困惑。
猜你喜欢
  • 2015-09-10
  • 2018-12-20
  • 2012-07-24
  • 1970-01-01
  • 1970-01-01
  • 2018-08-16
  • 2018-09-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多