ავტომატურად შექმნილი typescript-mongodb ტიპების გამართვა GraphQL შედეგებისთვის
მე ვიყენებ typescript-mongodb პლაგინს graphql-codegen-თან ერთად, რათა გენერირდეს TypeScript ტიპები MongoDB-დან მონაცემების წასაღებად და Node-ზე GraphQL-ის მეშვეობით გამოშვებისათვის.
ჩემი შესული GraphQL სქემა ასე გამოიყურება
type User @entity{
id: ID @id,
firstName: String @column @map(path: "first_name"),
...
გენერირებული output Typescript ტიპები სწორად გამოიყურება
export type User = {
__typename?: 'User',
id?: Maybe<Scalars['ID']>,
firstName?: Maybe<Scalars['String']>,
...
და შესაბამისი DB ობიექტი
export type UserDbObject = {
_id?: Maybe<String>,
first_name: Maybe<string>,
...
პრობლემა ის არის, რომ როდესაც ფაქტობრივად მიგზავნი Mongo დოკუმენტს როგორც UserDbObject, მე ვეღარ ვიღებ ტრანსფორმირებულ ფილდებს გამომავალი მონაცემებში. მე შემიძლია დავწერო სპეციალური რეზოლვერი, რომელიც ფილდებს უკან User ტიპში გადაამზადებს, მაგრამ ეს ნიშნავს, რომ მე ფილდებს ორი სხვადასხვა ადგილას ვამუშავებ.
შენიშნე, რომ მე ასეთად არ ვიღებ ნაპოვნ ველებს რეზოლვერიდან
userById: async(_root: any, args: QueryUserByIdArgs, _context: any) : Promise<UserDbObject> => {
const result = await connectDb().then((db) => {
return db.collection<UserDbObject>('users').findOne({'_id': args.id}).then((doc) => {
return doc;
});
})
...
return result as UserDbObject;
}
};
არსებობს რაიმე გზა, რომ გამოიყენოთ typescript-mongodb მოდული ისე, რომ მხოლოდ ეს ველები იყოს საჭირო სკიმაში დამთხვევისთვის, და შემდეგ გამოიყენოთ ავტომატურად გენერირებული კოდი მათი მოგვარებისთვის?
პასუხი #1
თქვენ შეგიძლიათ გამოიყენოთ mappers ფუნქცია codegen-ში, თქვენი GraphQL ტიპებსა და მოდელების ტიპებს შორის მორგებისათვის. იხილეთ:
- https://graphql-code-generator.com/docs/plugins/typescript-resolvers#mappers---overwrite-parents-and-resolved-values
- https://graphql-code-generator.com/docs/plugins/typescript-resolvers#mappers-object
რადგან ყველა კოდგენ_plugins დამოუკიდებელია და ერთმანეთთან დაკავშირებული არაა, საჭიროა ამას ხელით აკეთოთ, რაღაცასავით:
config:
mappers:
User: UserDbObject
ეს შექმნის იმას, რომ typescript-resolvers პლაგინი ნებისმიერ დროს გამოიყენებს UserDbObject (როგორც მშობელი მნიშვნელობა ან როგორც დაბრუნების მნიშვნელობა).
თუ გსურთ ამას ავტომატიზება, შეგიძლიათ გამოიყენოთ codegen პროგრამულად (https://graphql-code-generator.com/docs/getting-started/programmatic-usage), ან ასევე შეგიძლიათ შექმნათ .js ფაილი .yaml ფაილის ნაცვლად, რომელიც შეაშვებს კონფიგურაციის სექციას თქვენს საჭიროებებზე დაყრდნობით.
