【发布时间】:2019-02-15 18:28:36
【问题描述】:
这是我的typeDefs:
const typeDefs: string = `
type Book {
id: ID!
title: String
authorId: ID!
author: User
}
type User {
id: ID!
name: String
}
type Query {
books: [Book]!
}
`;
export { typeDefs };
resolvers:
import { IResolvers } from 'graphql-tools';
import { IBook } from './db';
const resolvers1: IResolvers = {
Query: {
books: (_, args, { db }): Promise<IBook[]> => {
return db.books.map(book => {
book.author = db.users.find(user => book.authorId === user.id);
return book;
});
}
}
};
const resolvers2: IResolvers = {
Query: {
books: (_, args, { db }): Promise<IBook[]> => {
return db.books;
}
},
Book: {
author: (book, args, { db }) => {
return db.users.find(user => book.authorId === user.id);
}
}
};
export { resolvers1, resolvers2 };
在resolvers1内,解析Book的所有字段。 (将author字段添加到book)
在resolvers2内,在独立解析器中解析Book的每个字段。
我发现 resovlers1 和 resolvers2 都可以正常工作。我可以得到这样的正确响应:
{
"data": {
"books": [
{
"id": "02wDZbBuMi",
"title": "Ea repellendus",
"authorId": "hhP2TtobM",
"author": {
"id": "hhP2TtobM",
"name": "Mrs. Destiney Kerluke"
}
},
{
"id": "tC3uPfKfUZ",
"title": "Consectetur fugit",
"authorId": "k9IHZAtld8",
"author": {
"id": "k9IHZAtld8",
"name": "Mr. Rene Heidenreich"
}
}
]
}
}
它们之间有什么区别?这两种方式正确吗?如果不是,为什么?
【问题讨论】:
-
在 GraphQL 中,您希望使用 resolver2 方法并使用 dataloader 来使该方法高效。也许只是尝试一下,一旦你的服务器变得更大,你就会自己发现它是如何工作的。 Youtube 上还有多个关于 dataloader 的视频。
-
是的。我知道
dataloader和N+1查询问题。但我认为使用resolver2的最重要原因是@Gabriel Bleu 的回答。还是谢谢。
标签: graphql graphql-js