如何使用全局ID?

时间:2016-08-08 16:47:06

标签: reactjs relayjs graphql-js

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]
});

1 个答案:

答案 0 :(得分:2)

全局ID主要用于重新获取已在中继客户端存储中的对象。我会干,并指向an excellent related SO post,这很好地解释了如何在接力中使用全局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. 使用id辅助函数向Y添加字段globalIdField。此id是全局ID,它在所有类型和对象中都是唯一的。如何生成此全局唯一ID字段取决于实现。 globalIdField辅助函数从对象X中的id字段和类型名称X生成此字段。
  4. nodeDefinitions中,使用fromGlobalId辅助函数从全局ID中检索本地ID和类型。由于X中的id字段是MongoDB中的_id字段,因此您可以使用此本地ID执行数据库操作。首先从十六进制字符串转换为MongoDB ID类型。
  5. 您的实施中必须打破本地ID分配(步骤2)。否则,每次重新加载时,同一对象的ID都不会有所不同。