graphql-tools:延迟获取?

graphql-tools: lazy fetching?

我正在尝试使用 Apollo 的 graphql 工具来简化 graphql 服务器。我想进行延迟获取,但无法像使用 javascript classes 作为解析器时那样 return 做出承诺。

这是我得到的:

架构

type Customer {
    details: Contact!
    addresses: [Address]!
}
    extend type Query {
        customers(first: Int = 0, next: Int = 50): [Customer]
        customer(id: Int!): Customer
    }

解析器

const domain1Resolvers = {
    Query: {
        customers: (_, {
            first,
            next
        }) => customers(first, next)
    }
};

解析方法:

const customers = (first, next) => {
    return new Promise(resolve => {
        var q =
            `
                SELECT *, company as organization FROM customer
                ORDER BY id DESC
                LIMIT ?, ?`;
        sql.query(q, [first, next], function(err, rows) {
            if (err) {
                throw Error(err);
            }
            resolve(rows.map(r => {
                return {
                    details: r,
                    addresses: () => getAddresses(r.id),
                }
            }));
        });
    })
};

只有在请求地址时才会调用方法 getAddresses。在基于 class 的方法中,我能够让 getAddresses return 成为 Promise,但如果我尝试使用此机制,它会抱怨没有 returning 一个 Iterable。一定有什么方法只在请求时才获取地址,但是画了一个空白,到目前为止还没有找到例子。

要仅在请求时解析 Customer 上的字段,您可能希望使用该特定字段的解析器而不是 customers 查询的解析器。您的解析器看起来像这样:

const domain1Resolvers = {
  Query: {
    customers: (_, {
      first,
      next
    }) => customers(first, next)
  },
  Customer: {
    addresses: ({ details: { id } }) => getAddresses(id)
  },
};