首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >GraphQL如何让解析器只在需要的时候获取数据?

GraphQL如何让解析器只在需要的时候获取数据?
EN

Stack Overflow用户
提问于 2018-05-27 07:26:17
回答 2查看 849关注 0票数 1

我有两种GraphQL类型:

代码语言:javascript
复制
type Author {
  id: String!
  name: String!
}

type Book {
  id: String!
  author: Author!
  name: String!
}

在我的数据库中,它是由books表中的一个外键实现的:

authors(伪代码)

代码语言:javascript
复制
`id` INTEGER UNSIGNED
`name` STRING

books(伪代码)

代码语言:javascript
复制
`id` INTEGER UNSIGNED
`author_id` INTEGER UNSIGNED REFERENCE `authors.id`
`name` STRING

因此,当我解析像这样的GraphQL查询时:

代码语言:javascript
复制
query allTheBooks {
  id
  name
  author {
    id
  }
}

除了将获得图书列表的查询之外,我不想执行另一个SQL查询,因为我在books.author_id字段中已经有了数据。

因此,我替换了以下代码(js):

代码语言:javascript
复制
Book: {
  async author(book, args, context, info) {
    // this code trigger a database SELECT query that fetch all the fields of the author row associated with the book
    return book.author().get();
  }
}

出自:

代码语言:javascript
复制
Book: {
  async author(book, args, context, info) {
    return {
      id: book.author_id,
    }
  }
}

而且它工作得很好!

我只有一个SQL查询,其中我有1+N (N是第一个查询返回的行数)。

但是如何才能在不按字段发送查询的情况下返回其他字段?

我认为有可能通过为所有字段返回一个唯一的承诺,这将与author行的所有内容一起解析,但我想知道是否有更干净的方法……

提前感谢您的答复!

EN

回答 2

Stack Overflow用户

发布于 2018-05-27 08:57:00

现在,我找到了一种或多或少干净的方法来做这件事:

代码语言:javascript
复制
Book: {
  async author(book, args, context, info) {
    let authorPromise = null;

    async function getAuthor() {
      if (authorPromise === null) {
        authorPromise = book.author().get();
      }

      return authorPromise;
    }

    return new Proxy({}, {
      async get({}, name) {
        if (name === "id") {
          return book.author_id;
        }

        if (name in authorFields) {
          const author = await getFile();
          return author[name];
        }
      },
    });
  }
}

它确保我每行只执行一次查询,但给我留下了另一个关于表连接的问题,但我将其发布为here :-)

票数 0
EN

Stack Overflow用户

发布于 2018-05-30 09:33:55

您不必进行1+N查询。您可以将N个查询批处理为1。只需查看https://github.com/facebook/dataloader即可。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50547791

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档