Dataloader 在 graphql 解析器中没有按预期工作
Dataloader is not working as expected in graphql resolver
我有一个数据加载器和我的 graphql,如下所示:
async function testDataLoader(accountNumber, req, args) {
const dummy = new DataLoader(async accountNumber => {
return new Promise(async (resolve, reject) => {
// rest call
return resolve([<rest result>])
});
});
return dummy.load(accountNumber)
}
export default {
Friends: {
query1: async ({req, args}) => {
const data = await testDataLoader(["12121"], req, args);
// do something with data
}
query2: async ({req, args}) => {
const data = await testDataLoader(["12121"], req, args);
// do something with data
}
}
};
当我们查询时:
Friends {
query1
query2
}
我希望数据加载器只调用我的休息服务一次。但是,我可以看到我的休息被叫了两次。不确定,我在哪里犯了错误。
问题是每次调用 testDataLoader
时,您都会创建一个新的 DataLoader 实例。您应该为每个请求(每个您正在加载的资源)创建一个 DataLoader 实例。这样,每次调用 load
时,您都在与同一个缓存进行交互。
您可以做如下事情:
const dummy = new DataLoader(...);
async function testDataLoader(accountNumber) {
return dummy.load(accountNumber)
}
但这会在请求之间保留 DataLoader,这是您不想做的。您应该做的是创建 DataLoader 实例作为上下文的一部分,每次执行请求时都会重新创建它。
const context = async ({ req }) => {
return {
testLoader = new DataLoader(...),
};
},
const server = new ApolloServer({
...
context,
})
然后直接在解析器中调用加载程序:
query2: async (parent, args, context) => {
const data = await context.testLoader.load(["12121"]);
...
}
我有一个数据加载器和我的 graphql,如下所示:
async function testDataLoader(accountNumber, req, args) {
const dummy = new DataLoader(async accountNumber => {
return new Promise(async (resolve, reject) => {
// rest call
return resolve([<rest result>])
});
});
return dummy.load(accountNumber)
}
export default {
Friends: {
query1: async ({req, args}) => {
const data = await testDataLoader(["12121"], req, args);
// do something with data
}
query2: async ({req, args}) => {
const data = await testDataLoader(["12121"], req, args);
// do something with data
}
}
};
当我们查询时:
Friends {
query1
query2
}
我希望数据加载器只调用我的休息服务一次。但是,我可以看到我的休息被叫了两次。不确定,我在哪里犯了错误。
问题是每次调用 testDataLoader
时,您都会创建一个新的 DataLoader 实例。您应该为每个请求(每个您正在加载的资源)创建一个 DataLoader 实例。这样,每次调用 load
时,您都在与同一个缓存进行交互。
您可以做如下事情:
const dummy = new DataLoader(...);
async function testDataLoader(accountNumber) {
return dummy.load(accountNumber)
}
但这会在请求之间保留 DataLoader,这是您不想做的。您应该做的是创建 DataLoader 实例作为上下文的一部分,每次执行请求时都会重新创建它。
const context = async ({ req }) => {
return {
testLoader = new DataLoader(...),
};
},
const server = new ApolloServer({
...
context,
})
然后直接在解析器中调用加载程序:
query2: async (parent, args, context) => {
const data = await context.testLoader.load(["12121"]);
...
}