Загрузка…
Загрузка…
GraphQL schema — typed contract; N+1 — classic trap, fix DataLoader; client fetches exactly needed fields.
# Schema: the typed contract, introspectable by tooling
type User { id: ID!, name: String!, orders: [Order!]! }
type Order { id: ID!, total: Int!, items: [Item!]! }
type Query { user(id: ID!): User }// ❌ N+1: this resolver runs once PER user in the list → 100 DB round trips
const resolvers = {
User: {
company: (user) => db.company.findById(user.companyId), // fires per user
},
};
// ✅ DataLoader batches all companyId lookups in one tick into ONE query
const companyLoader = new DataLoader(async (ids) => {
const rows = await db.company.findMany({ where: { id: { in: ids } } });
return ids.map((id) => rows.find((r) => r.id === id)); // must return in input order
});
const resolvers = {
User: { company: (user) => companyLoader.load(user.companyId) }, // batched + cached
};// Client: fetch exactly what the view needs — no over/under-fetch
const { data } = useQuery(gql`
query { user(id: 7) { name orders(last: 3) { total } } }
`);DataLoader batch + cache per request; return order must match input ids. Client query mirrors view shape.
GraphQL code story: schema + DataLoader against N+1 + precise client query — minimum senior demo.
