Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/go/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Graphql 解析一个解析程序中的所有字段V.S.解析每个解析程序中的字段_Graphql_Graphql Js - Fatal编程技术网

Graphql 解析一个解析程序中的所有字段V.S.解析每个解析程序中的字段

Graphql 解析一个解析程序中的所有字段V.S.解析每个解析程序中的字段,graphql,graphql-js,Graphql,Graphql Js,这是我的typeDefs: const typeDefs:string=` 打字簿{ id:id! 标题:字符串 作者:ID! 作者:用户 } 类型用户{ id:id! 名称:String } 类型查询{ 书:[书]! } `; 导出{typeDefs}; 解析器: 从“graphql工具”导入{IResolver}; 从“./db”导入{IBook}; 常量解析程序1:iResolver={ 查询:{ 书籍:(u,args,{db}):Promise=>{ 返回db.books.map(bo

这是我的
typeDefs

const typeDefs:string=`
打字簿{
id:id!
标题:字符串
作者:ID!
作者:用户
}
类型用户{
id:id!
名称:String
}
类型查询{
书:[书]!
}
`;
导出{typeDefs};
解析器

从“graphql工具”导入{IResolver};
从“./db”导入{IBook};
常量解析程序1:iResolver={
查询:{
书籍:(u,args,{db}):Promise=>{
返回db.books.map(book=>{
book.author=db.users.find(user=>book.authord==user.id);
还书;
});
}
}
};
常量解析程序2:iResolver={
查询:{
书籍:(u,args,{db}):Promise=>{
归还db.books;
}
},
书籍:{
作者:(书,args,{db})=>{
返回db.users.find(user=>book.authorId==user.id);
}
}
};
导出{resolvers1,resolvers2};
resolvers1
中,它解析
Book
的所有字段。(将
作者
字段添加到
书籍

resolvers2
中,它解析独立解析程序中
Book
的每个字段

我发现
resolvlers1
resolvers2
都可以正常工作。我可以得到这样的正确回答:

{
“数据”:{
“书籍”:[
{
“id”:“02wDZbBuMi”,
“标题”:“Ea驱避剂”,
“作者”:“hhP2TtobM”,
“作者”:{
“id”:“hhP2TtobM”,
“姓名”:“Destiney Kerluke夫人”
}
},
{
“id”:“tC3uPfKfUZ”,
“头衔”:“康塞特图尔·福吉特”,
“authorId”:“k9IHZAtld8”,
“作者”:{
“id”:“k9IHZAtld8”,
“姓名”:“Rene Heidenreich先生”
}
}
]
}
}

他们之间有什么区别?这两种方法正确吗?如果没有,,为什么?

resolver2
更好,因为如果您的请求中不包含
author
,它就不会对数据库进行无用的调用。

resolver2
更好,因为如果您的请求中不包含
author
,它就不会对数据库进行无用的调用。

resolver1
是一种权衡性能的复杂性。resolver one的主要参数是数据库通常具有
resolver 2
无法使用的联接。例如,book+author查询可以用一条SQL语句表示。与版本2相比,即使使用Dataloader,这也是一个巨大的性能优势。现在有人可能会说,我们甚至不知道是否需要author字段。但是我们可以知道,使用
resolveInfo
参数。可以编写一个函数,快速检查resolveInfo并告诉我们子选择中是否存在字段:

hasSelection(fieldName: string, resolveInfo: GraphQLResolveInfo): boolean
然后我们可以使用这个函数来检查是否应该进行连接

books: (_, args, { db }, resolveInfo): Promise<IBook[]> => {
  if (hasSelection('author', resolveInfo)) {
    // Just an example, there is some more transformation needed
    return db.query('SELECT ... FROM book JOIN author ON book.authorId = author.id');
  }
  return db.query('SELECT ... FROM book');
}
books:(wk,args,{db},resolveInfo):Promise=>{
if(hasSelection('author',resolveInfo)){
//仅举一个例子,需要进行更多的转换
返回db.query('SELECT…FROM book JOIN author ON book.authord=author.id');
}
返回db.query('SELECT…FROM book');
}

这可能会有两倍的效果。实际上有很多公司这样做,因为有时候绩效是关键。如果示例变得更复杂,那么复杂性会显著增加,如果不首先确定它是一个瓶颈,我不会进行此类优化。另一方面,有许多项目在“原生GraphQL”上工作,这意味着他们正在将GraphQL查询直接转换为数据库查询。

resolver1
是一种复杂度与性能的折衷。resolver one的主要参数是数据库通常具有
resolver 2
无法使用的联接。例如,book+author查询可以用一条SQL语句表示。与版本2相比,即使使用Dataloader,这也是一个巨大的性能优势。现在有人可能会说,我们甚至不知道是否需要author字段。但是我们可以知道,使用
resolveInfo
参数。可以编写一个函数,快速检查resolveInfo并告诉我们子选择中是否存在字段:

hasSelection(fieldName: string, resolveInfo: GraphQLResolveInfo): boolean
然后我们可以使用这个函数来检查是否应该进行连接

books: (_, args, { db }, resolveInfo): Promise<IBook[]> => {
  if (hasSelection('author', resolveInfo)) {
    // Just an example, there is some more transformation needed
    return db.query('SELECT ... FROM book JOIN author ON book.authorId = author.id');
  }
  return db.query('SELECT ... FROM book');
}
books:(wk,args,{db},resolveInfo):Promise=>{
if(hasSelection('author',resolveInfo)){
//仅举一个例子,需要进行更多的转换
返回db.query('SELECT…FROM book JOIN author ON book.authord=author.id');
}
返回db.query('SELECT…FROM book');
}

这可能会有两倍的效果。实际上有很多公司这样做,因为有时候绩效是关键。如果示例变得更复杂,那么复杂性会显著增加,如果不首先确定它是一个瓶颈,我不会进行此类优化。另一方面,有很多项目在“原生GraphQL”上工作,这意味着他们正在将GraphQL查询直接转换为数据库查询。

在GraphQL中,您希望使用Resolver 2方法,并使用它来提高方法的性能。也许只是尝试一下,你会发现当你的服务器变得更大时,它是如何工作得最好的。Youtube上也有很多关于dataloader的视频。我知道
dataloader
N+1
查询问题。但我认为使用
resolver2
最重要的原因是@Gabriel Bleu的答案。无论如何,谢谢。在GraphQL中,您希望使用resolver2方法,并使用使该方法具有性能。也许只是尝试一下,你会发现当你的服务器变得更大时,它是如何工作得最好的。Youtube上也有很多关于dataloader的视频。我知道
dataloader
N+1
查询问题。但我认为