Resolvers
Resolver adalah fungsi yang menyediakan data untuk setiap field di schema. Saat client query sebuah field, resolver yang sesuai dipanggil.
Anatomy of a Resolver
// resolver(parent, args, context, info)
const resolvers = {
Query: {
user: async (parent, { id }, context) => {
return context.db.users.findById(id);
},
users: async (parent, { limit, offset }, context) => {
return context.db.users.findMany({ take: limit, skip: offset });
},
},
Mutation: {
createUser: async (parent, { input }, context) => {
return context.db.users.create({ data: input });
},
},
// Field-level resolver
User: {
posts: async (parent, args, context) => {
// parent = user object dari parent resolver
return context.db.posts.findMany({
where: { authorId: parent.id },
});
},
fullName: (parent) => {
return `${parent.firstName} ${parent.lastName}`;
},
},
};
Resolver Arguments
- parent — Result dari parent resolver (root = undefined)
- args — Arguments yang dikirim di query
- context — Shared per-request (db connection, auth user, loaders)
- info — AST info tentang query (advanced, jarang dipakai)
Context Setup
// Server setup (Apollo Server)
const server = new ApolloServer({
typeDefs,
resolvers,
});
// Context per request
const { url } = await startStandaloneServer(server, {
context: async ({ req }) => ({
db: prisma,
user: await getAuthUser(req.headers.authorization),
loaders: createLoaders(), // DataLoader instances
}),
});
Default Resolvers
// GraphQL punya default resolver: parent[fieldName]
// Jadi jika parent.name sudah ada, tidak perlu resolver untuk field "name"
// Hanya tulis resolver jika:
// 1. Field butuh custom logic (computed field)
// 2. Field butuh data dari sumber lain (database query)
// 3. Field butuh transformasi