简体   繁体   English

在任何父解析器中使用子 graphql 解析器 - 解析器链接

[英]use child graphql resolver inside any parent resolver - resolver chaining

Let's say I have an author with different books.假设我有一个作者,他有不同的书。
I can either fetch a book alone, or fetch an author with its books.我可以单独取一本书,也可以找一个作者连同它的书。

type Query {
  author(authorId: ID!): Author
  book(bookId: ID!): Book
}

type Author {
  books: [Book!]!
}

type Book {
  title: String!
}

The book can already resolve by himself:本书已经可以自己解决:

// book-resolver.js
{
  // single source of truth for book resolving
  Book: {
    title: (_, {bookId}) => fetchBookTitleByBookId(bookId)
  }
}

How can I reuse the book resolver in the Author's resolver?如何在作者的解析器中重用图书解析器? I would like to avoid rewriting it:我想避免重写它:

// author-resolver.js
{
  Author: {
    books: (_, {authorId}) => {
      const bookIds = fetchBookIdsByAuthorId(authorId)
    
      return {
        // here I'm duplicating logic. Can I avoid it?
        books: bookIds.map(bookId => ({
          title: fetchBookTitleByBookId(bookId)
        })
      }
    }
  }
}

I think that creating an utility function (eg fetchBook(id) ) and using it everywhere wouldn't match the "paradigm" of resolver chaining.我认为创建一个实用程序 function (例如fetchBook(id) )并在任何地方使用它都不符合解析器链接的“范式”。

Generally, it is a bad idea to query so many items singularly, but if you must do so, you can use Apollo resolver chains一般来说,单独查询这么多项目是个坏主意,但如果必须这样做,可以使用Apollo 解析器链

Keep in mind thad by doing so, you will call fetchBookTitleByBookId(bookId) n times (where n is the number of books) + fetchBookIdsByAuthorId(authorId) once.请记住,这样做,您将调用fetchBookTitleByBookId(bookId) n 次(其中 n 是书籍的数量)+ fetchBookIdsByAuthorId(authorId)一次。 See this answer for more info https://stackoverflow.com/a/60832838/10909317有关更多信息,请参阅此答案https://stackoverflow.com/a/60832838/10909317

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM