Javascript graphql工具:延迟抓取?

Javascript graphql工具:延迟抓取?,javascript,graphql-js,apollo-server,Javascript,Graphql Js,Apollo Server,我正在尝试使用Apollo的graphql工具简化graphql服务器。我想做延迟抓取,但不能像使用javascript类作为解析器那样返回承诺 以下是我得到的: 模式 type Customer { details: Contact! addresses: [Address]! } extend type Query { customers(first: Int = 0, next: Int = 50): [Customer] custo

我正在尝试使用Apollo的graphql工具简化graphql服务器。我想做延迟抓取,但不能像使用javascript类作为解析器那样返回承诺

以下是我得到的:

模式

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方法。在基于类的方法中,我可以让getAddresses返回一个承诺,但是如果我尝试使用这种机制,它会抱怨没有返回Iterable。必须有某种方法仅在请求时获取地址,但绘制一个空白,目前尚未找到示例。

若要仅在请求时解析Customer上的字段,您需要使用该特定字段的解析程序,而不是
customers
查询的解析程序。您的解析程序将如下所示:

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

明亮的非常感谢。我从来没有遇到过这样的事情。