Thuta Learning
ရှာဖွေရန်
GraphQL
AdvancedWeb Developmentbeginner

Resolvers Deep Dive နှင့် Context

ဒီခန်းပြီးရင် ဘာတတ်သွားမလဲ

  • Resolvers Deep Dive နှင့် Context concept ကို နားလည်ရှင်းပြနိုင်ရန်
  • နမူနာ GraphQL query/code ကို ကိုယ်တိုင် run ပြီး output စစ်နိုင်ရန်
  • Tutorial Platform project နှင့် production scenario တွင် မှန်ကန်စွာအသုံးချနိုင်ရန်

နားလည်ထားရမယ့် အချက်

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 လုပ်ပါမယ်။

အတူတူ စမ်းရေးကြည့်မယ်

typescript
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),
  }),
});
You should see
Resolver argument လေးခုကို ခွဲခြားနိုင်ပြီး typed context object တစ်ခု ရေးနိုင်မည်။

၅ မိနစ် စမ်းကြည့်

`Tutorial.author` resolver ထဲမှာ `parent` argument ကို ဘယ်လိုသုံးမလဲ (authorId ရယူနည်း) ရေးပါ။

သတိလေးတစ်ချက်

Database connection ကို resolver function ထဲမှာ တစ်ကြိမ်ချင်း အသစ်ဖွင့်ရင် request တစ်ခုအတွင်း connection အများကြီးဖွင့်နေနိုင်ပါတယ်—context ထဲက shared connection/pool ကိုပဲ သုံးပါ။

Apollo Server — ResolversGraphQL

ဒီနေရာမှာ လူအများမှားတတ်တယ်

  • Database connection ကို resolver function ထဲမှာ တစ်ကြိမ်ချင်း အသစ်ဖွင့်ရင် request တစ်ခုအတွင်း connection အများကြီးဖွင့်နေနိုင်ပါတယ်—context ထဲက shared connection/pool ကိုပဲ သုံးပါ။
  • နမူနာ query/mutation ကို production API ပေါ် တိုက်ရိုက်မစမ်းဘဲ local/test server နှင့် recoverable data ပေါ်တွင် အရင်အတည်ပြုပါ။

လေ့ကျင့်ခန်း

`Tutorial.author` resolver ထဲမှာ `parent` argument ကို ဘယ်လိုသုံးမလဲ (authorId ရယူနည်း) ရေးပါ။

You'll know it worked when: Resolver argument လေးခုကို ခွဲခြားနိုင်ပြီး typed context object တစ်ခု ရေးနိုင်မည်။

Resolvers Deep Dive နှင့် Context | Thuta Learning