为什么需要以及如何在Relay.js中正确使用viewer
?
我过去一周试图了解Relay.js。我现在对GraphQL很好,我理解得很好,但我在同一个应用程序中将GraphQL和Relay.js联合起来有一些问题。
第一步可能是了解viewer
。我已经看过许多使用它的示例和教程,但它从未被解释过,它的确切内容和用途是什么并不十分清楚。
接力文档提及viewer
几次,但是没有一个单词可以解释它。
我希望我能为这个问题做点什么,但我担心网上没有解释。它只在代码中使用,并且脱离上下文没有任何意义。回答这个问题需要一些关于Realy.js / GraphQL的知识。
根据我检查的无数个例子,我最好的猜测是它与用户有某种关系?如果用户是匿名或登录?根据登录状态或用户级别授予对数据的不同访问权限?
答案 0 :(得分:8)
viewer
不是特定于接力的东西。这只是一个字段名称。你真是太好了。该字段通常表示应用程序的用户或查看器的GraphQLObject类型。
根查询类型是我们定义的GraphQL对象,并在架构对象中作为query
传递。例如,在todo example application中,它是Root
。
export const schema = new GraphQLSchema({
query: Root,
mutation: Mutation,
});
在relay-treasurehunt example application中,根查询类型为queryType
。
export const schema = new GraphQLSchema({
query: queryType,
mutation: mutationType,
});
根查询类型是访问其他数据的主要访问点。这些其他数据列为根查询对象的字段。与任何GraphQL对象一样,根查询类型可以包含一个或多个字段。在todo示例应用程序中,它有一个名为viewer
的字段:
const Root = new GraphQLObjectType({
name: 'Root',
fields: {
viewer: {
type: GraphQLUser,
resolve: () => getViewer(),
},
node: nodeField,
},
});
在relay-treasurehunt示例应用程序中,根查询类型有一个名为game
的字段。
const queryType = new GraphQLObjectType({
name: 'Query',
fields: () => ({
node: nodeField,
game: {
type: gameType,
resolve: () => getGame(),
},
}),
});
现在,如果有viewer
字段来表示应用程序用户或网站查看器,则用户是匿名还是完全登录取决于应用程序。如果用户需要登录,则可以实现登录变异。您还可以限制对数据的访问。 Jonas Helfer在服务器端发布了excellent answer如何进行用户访问检查。