当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]
});
答案 0 :(得分:2)
全局ID主要用于重新获取已在中继客户端存储中的对象。我会干,并指向an excellent related SO post,这很好地解释了如何在接力中使用全局ID。
如果您使用库中的辅助函数,例如JavaScript中的graphql-relay-js,那么处理全局ID变得非常简单:
id
。此id
是本地ID,对于X类型的任何对象,它必须是唯一的。如果X符合MongoDB文档类型,那么一个简单的方法是将_id
的字符串表示形式分配给此id
字段:instanceOfX.id = dbObject._id.toHexString()
。id
辅助函数向Y添加字段globalIdField
。此id
是全局ID,它在所有类型和对象中都是唯一的。如何生成此全局唯一ID字段取决于实现。 globalIdField
辅助函数从对象X中的id
字段和类型名称X
生成此字段。nodeDefinitions
中,使用fromGlobalId
辅助函数从全局ID中检索本地ID和类型。由于X中的id
字段是MongoDB中的_id
字段,因此您可以使用此本地ID执行数据库操作。首先从十六进制字符串转换为MongoDB ID类型。您的实施中必须打破本地ID分配(步骤2)。否则,每次重新加载时,同一对象的ID都不会有所不同。