Skip to content

Commit 9ff0542

Browse files
committed
15-Batching and Caching in GraphQL with Data Loader
1 parent d11e048 commit 9ff0542

File tree

6 files changed

+35
-3
lines changed

6 files changed

+35
-3
lines changed

server/package-lock.json

Lines changed: 5 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

server/package.json

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@
99
"test": "mocha --require @babel/register 'src/**/*.spec.js'"
1010
},
1111
"keywords": [],
12-
"author": "",
12+
"author": "Robin Wieruch <hello@rwieruch.com> (https://www.robinwieruch.de)",
1313
"license": "ISC",
1414
"devDependencies": {
1515
"@babel/core": "^7.1.2",
@@ -26,6 +26,7 @@
2626
"apollo-server-express": "^2.1.0",
2727
"bcrypt": "^3.0.2",
2828
"cors": "^2.8.4",
29+
"dataloader": "^1.4.0",
2930
"dotenv": "^6.1.0",
3031
"express": "^4.16.4",
3132
"graphql": "^14.0.2",

server/src/index.js

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ import 'dotenv/config';
22
import cors from 'cors';
33
import http from 'http';
44
import jwt from 'jsonwebtoken';
5+
import DataLoader from 'dataloader';
56
import express from 'express';
67
import {
78
ApolloServer,
@@ -11,6 +12,7 @@ import {
1112
import schema from './schema';
1213
import resolvers from './resolvers';
1314
import models, { sequelize } from './models';
15+
import loaders from './loaders';
1416

1517
const app = express();
1618

@@ -49,6 +51,11 @@ const server = new ApolloServer({
4951
if (connection) {
5052
return {
5153
models,
54+
loaders: {
55+
user: new DataLoader(keys =>
56+
loaders.user.batchUsers(keys, models),
57+
),
58+
},
5259
};
5360
}
5461

@@ -59,6 +66,11 @@ const server = new ApolloServer({
5966
models,
6067
me,
6168
secret: process.env.SECRET,
69+
loaders: {
70+
user: new DataLoader(keys =>
71+
loaders.user.batchUsers(keys, models),
72+
),
73+
},
6274
};
6375
}
6476
},

server/src/loaders/index.js

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
import * as user from './user';
2+
3+
export default { user };

server/src/loaders/user.js

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
export const batchUsers = async (keys, models) => {
2+
const users = await models.User.findAll({
3+
where: {
4+
id: {
5+
$in: keys,
6+
},
7+
},
8+
});
9+
10+
return keys.map(key => users.find(user => user.id === key));
11+
};

server/src/resolvers/message.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -73,8 +73,8 @@ export default {
7373
},
7474

7575
Message: {
76-
user: async (message, args, { models }) => {
77-
return await models.User.findById(message.userId);
76+
user: async (message, args, { loaders }) => {
77+
return await loaders.user.load(message.userId);
7878
},
7979
},
8080

0 commit comments

Comments
 (0)