နားလည်ထားရမယ့် အချက်
Resolver function တိုင်းက argument လေးခု လက်ခံနိုင်ပါတယ်—`parent` (parent field ရဲ့ resolved value), `args` (field arguments), `context` (request တစ်ခုချင်းစီအတွက် shared object—db connection, current user), `info` (execution metadata, ရှားရှား သုံးပါတယ်)။ `context` ကို request တစ်ခုချင်းစီအတွက် Apollo Server ရဲ့ `context` function ထဲမှာ ဖန်တီးပြီး resolver အားလုံးထံ pass ချသွားပါတယ်—database connection pooling, current authenticated user ကို ဒီနေရာမှာ တစ်နေရာတည်းစီမံနိုင်ပါတယ်။
လက်တွေ့ scenario နဲ့ ချိတ်ကြည့်မယ်
Tutorial Platform ရဲ့ `Context` interface ထဲမှာ `db` (typed database client) နှင့် `userId` (token ကနေ decode ထားသော string or null) ထည့်မယ်။ `Query.tutorial` resolver ထဲမှာ `context.db.tutorial.findUnique(...)` ခေါ်ပြီး database access logic တစ်ခုတည်းကို resolver အားလုံးမှာ တစ်ပုံစံတည်း reuse လုပ်ပါမယ်။
အတူတူ စမ်းရေးကြည့်မယ်
interface Context {
db: Database;
userId: string | null;
}
const resolvers = {
Query: {
tutorial: (
_parent: unknown,
args: { id: string },
context: Context,
) => context.db.tutorial.findUnique({ where: { id: args.id } }),
},
};
const server = new ApolloServer<Context>({ typeDefs, resolvers });
await startStandaloneServer(server, {
context: async ({ req }) => ({
db,
userId: getUserIdFromToken(req.headers.authorization),
}),
});Resolver argument လေးခုကို ခွဲခြားနိုင်ပြီး typed context object တစ်ခု ရေးနိုင်မည်။၅ မိနစ် စမ်းကြည့်
`Tutorial.author` resolver ထဲမှာ `parent` argument ကို ဘယ်လိုသုံးမလဲ (authorId ရယူနည်း) ရေးပါ။
သတိလေးတစ်ချက်
Database connection ကို resolver function ထဲမှာ တစ်ကြိမ်ချင်း အသစ်ဖွင့်ရင် request တစ်ခုအတွင်း connection အများကြီးဖွင့်နေနိုင်ပါတယ်—context ထဲက shared connection/pool ကိုပဲ သုံးပါ။
Apollo Server — Resolvers — GraphQL