قم ببناء واجهة برمجة التطبيقات الخاصة بك باستخدام تقنيات الويب الشائعة هذه.
تقوم GraphQL و NestJS بعمل شراكة ممتازة ، مما يمنحك أساسًا متينًا لواجهات برمجة التطبيقات وإطار عمل سهل الاستخدام لإنشاء تطبيقات ويب قابلة للتطوير. يعتبر هذا المزيج مثاليًا لإنشاء تطبيقات جاهزة للإنتاج ، وكلاهما من الأدوات الملائمة جدًا في النظام البيئي التكنولوجي اليوم.
اكتشف المزيد حول كيفية إنشاء واجهة برمجة تطبيقات باستخدام كلا المنتجين.
ما هي GraphQL؟
GraphQL هي لغة استعلام بيانات ومعالجة يمكنك استخدامها لبناء واجهات برمجة التطبيقات بطريقة أكثر دقة وإيجازًا. توفر GraphQL وصفًا كاملاً ومناسبًا للبيانات الموجودة في واجهة برمجة التطبيقات وتمنح العميل القوة للحصول على البيانات الدقيقة المطلوبة.
توفر GraphQL العديد من الميزات التي تفتقر إليها REST APIs ، بدءًا من استعلامات البيانات الدقيقة إلى أدوات المطورين الأفضل ، مثل رسم بياني محرر. كما يسمح لك بالاستعلام عن موارد متعددة عبر طلب واحد.
ما هو NestJS؟
NestJS هو إطار عمل Node.js تقدمي يمكنك استخدامه لبناء تطبيقات فعالة وقابلة للتطوير من جانب الخادم. يوفر NestJS العديد من المكونات الإضافية ، جنبًا إلى جنب مع الأدوات اللازمة للتطوير السريع والسهل بما في ذلك دعم GraphQL و GRPC و WebSockets وما إلى ذلك.
تشتهر NestJS في النظام البيئي بهيكلها الأمثل للمشروع باستخدام الوحدات النمطية ، وأجهزة التحكم ، والخدمات ، والمخططات. يسمح لك CLI المدمج الخاص به بإنشاء بنية API منظمة. يمكنك استخدام مبادئ حقن التبعية للتحكم في كيفية تواصل أجزاء التطبيق مع بعضها البعض.
تنفيذ GraphQL مع NestJS و MongoDB
قبل إنشاء واجهة برمجة تطبيقات باستخدام NestJS و GraphQL ، ستحتاج إلى توفر التبعيات الصحيحة. انت تحتاج لتثبيت Node.js و NestJS ، والتي يمكنك تثبيتها عن طريق التشغيل npm أنا -g @ nestjs / cli.
المثال التالي هو تطبيق بسيط يخزن معلومات حول الكتب. قم بتشغيل الأمر التالي في جهازك لإنشاء تطبيق NestJS جديد:
عش جديد
انتقل إلى دليل التطبيق الذي تم إنشاؤه () وقم بتثبيت تبعياتها بالأمر التالي:
$ npm install --save @ nestjs / config @ nestjs / graphql graphql-tools graphql \
@ nestjs / apollo-server-express @ nestjs / mongoose @ types / graphql
هناك طريقتان رئيسيتان لبناء واجهات برمجة تطبيقات GraphQL ، وهما:
- نهج المخطط الأول: حيث يمكنك وصف واجهة برمجة التطبيقات في ملفات تعريف المخطط أو SDL ، ويقوم NestJS بإنشاء تعريفات تنضيد بناءً عليها.
- نهج الكود الأول: حيث تقوم بتعريف الاستعلامات والطفرات والوظائف الأخرى في GraphQL باستخدام فئات ومُزخرفات الأنواع ، ويقوم NestJS بإنشاء ملفات SDL بناءً عليها.
يصف المثال التالي كيفية استخدام نهج التعليمات البرمجية أولاً.
أولاً ، تحتاج إلى تهيئة GraphQL في ملف AppModule و توصيله بقاعدة بيانات MongoDB:
// app.module.ts
يستورد { وحدة } من"@ nestjs / مشترك";
يستورد {GraphQLModule مثل وحدة NestGraphQL} من"@ nestjs / graphql";
يستورد {ApolloDriver ، ApolloDriverConfig} من"@ nestjs / أبولو";
يستورد { ينضم } من'طريق';
يستورد {MongooseModule} من"@ nestjs / النمس";
يستورد {AppController} من"./app.controller";
يستورد {AppService} من"./app.service";
يستورد {ConfigModule، ConfigService} من"@ nestjs / config";
يستورد mongodbConfig من"./config/mongodb.config";@وحدة({
الواردات: [
ConfigModule.forRoot ({
تحميل: [mongodbConfig] ،
isGlobal: حقيقي
}),
NestGraphQLModule.forRoot Async({
سائق: أبولو درايفر ،
حقن: [ConfigService] ،
useFactory: المصنع غير متزامن (configService: ConfigService) => ({
autoSchemaFile: Join (process.cwd () ، "src / schema.gql"),
installSubscription المعالجات: حقيقي,
الترتيب حقيقي,
ملعب: حقيقي,
التصحيح: configService.get <قيمة منطقية>("تصحيح"),
التحميلات: خطأ شنيع,
}),
}),
MongooseModule.forRootAsync ({
حقن: [ConfigService] ،
useFactory: المصنع غير متزامن (configService: ConfigService) => ({
uri: configService.get ("MONGO_URI")
})
}),
],
وحدات التحكم: [AppController] ،
الموفرون: [AppService] ،
})
يصدّرفصل AppModule {}
تستورد هذه الوحدة ملف وحدة GraphQL من @ nestjs / graphql و ال النمس من @ nestjs / النمس مما يساعد على الاتصال بـ MongoDB. ال ملف autoSchema تحدد الخاصية موقع ملف المخطط الذي تم إنشاؤه ، و الترتيب تضمن الخاصية أنها ترتب الحقول أبجديًا.
هذا ما هو MongoDB الخاص بك التكوين يجب أن يبدو الملف بالشكل:
يستورد {تسجيل باسم} من"@ nestjs / config";
/**
* تكوين اتصال قاعدة بيانات مونغو
*/
يصدّرتقصير تسجيل باسم ("منجودب", () => {
مقدار ثابت {
MONGO_URI
} = process.env ؛
يعود {
uri: `{MONGO_URI} دولار`,
};
});
تحديد مخطط GraphQL
بعد إعداد اتصالات GraphQL و MongoDB ، يجب عليك تحديد استعلامات GraphQL والطفرات لإنشاء مخطط (schema.gql) ملف.
استعلامات الكتابة
في ال نهج الكود أولا، يمكنك إنشاء نموذج باستخدام نوع الكائن مصمم. ستقوم لاحقًا بتحويل هذا النموذج إلى نوع GraphQL.
على سبيل المثال:
// book.model.ts
يستورد {حقل ، نوع الكائن} من"@ nestjs / graphql";
يستورد {Prop ، Schema ، SchemaFactory} من"@ nestjs / النمس";
يستورد { وثيقة } من'النمس';يصدّريكتب BookDocument = كتاب و مستند ؛
@نوع الكائن()
@مخطط()
يصدّرفصل كتاب {
@مجال()
عنوان: خيط;@مجال()
مؤلف: خيط;@مجال()
تاريخ النشر: قيمة منطقية;
}
يصدّرمقدار ثابت BookSchema = SchemaFactory.createForClass (كتاب) ،
لا يمكن لـ GraphQL ، افتراضيًا ، استخدام المخططات التي تم إنشاؤها. لجعلها فعالة ، تحتاج إلى خدمة محلل تحتوي على وظائف لتنفيذ أنواع GraphQL. يمكنك القيام بذلك باستخدام محلل مصمم.
// books.resolver.ts
يستورد {المحلل ، الاستعلام ، التبديل ، الوسيط ، المعرف} من"@ nestjs / graphql";
يستورد { كتاب } من"./book.model";
يستورد {BookService} من"./books.service";تضمين التغريدة(() => كتاب)
يصدّرفصل BookResolver {
البناء(خاص للقراءة فقط bookService: BookService) { }@استفسار(() => [كتاب])
غير متزامن الكتب (): يعد{
يعودهذا.bookService.findAll () ،
}
@استفسار(() => كتاب)
غير متزامن كتاب(تضمين التغريدة('بطاقة تعريف', { يكتب: () => فعلتُ: خيط): يعد{
يعودهذا.bookService.findOne (معرف) ؛
}
}
يمكنك تنفيذ BookService، مستورد أعلاه على النحو التالي:
// books.service.ts
يستورد {قابل للحقن} من"@ nestjs / مشترك";
يستورد {InjectModel} من"@ nestjs / النمس";
يستورد { نموذج } من'النمس';
يستورد {Book، BookDocument} من"./book.model";تضمين التغريدة()
يصدّرفصل خدمة الكتب {
البناء(تضمين التغريدة(اسم الكتاب) خاص نموذج الكتاب: نموذج) { }غير متزامن جد كل(): يعد
{
يعودهذا.bookModel.find (). exec () ؛
}
غير متزامن findOne (المعرف: خيط): يعد
{
يعودهذا.bookModel.findById (id) .exec () ،
}
}
تحتاج أيضًا إلى إضافة BookResolver إلى قائمة الموفرين في books.module.ts.
يستورد { وحدة } من"@ nestjs / مشترك";
يستورد {MongooseModule} من"@ nestjs / النمس";
يستورد {BookService} من"./books.service";
يستورد {BookResolver} من"./books.resolver";
يستورد {Book، BookSchema} من"./book.model";@وحدة({
الموفرون: [
BookService ،
BookResolver
],
الواردات: [MongooseModule.forFeature ([
{
الاسم: Book.name ،
المخطط: BookSchema ،
},
]),
],
})
يصدّرفصل وحدة Books {}
العمل مع الطفرات
أثناء استخدام استعلام لاسترداد البيانات في GraphQL ، تقوم الطفرات بإنشاء أو تحديث البيانات في قاعدة البيانات. لإنشاء الطفرات ، تحتاج إلى قبول البيانات من المستخدمين. ال نوع الإدخال يعتبر برنامج decorator ، الذي يحول الفصل إلى نوع إدخال GraphQL ، مفيدًا هنا.
// book.input.ts
يستورد {InputType ، حقل} من"@ nestjs / graphql";InputType()
يصدّرفصل إدخال الكتاب {
@مجال()
عنوان: خيط;@مجال()
مؤلف: خيط;
@مجال()
تاريخ النشر: قيمة منطقية
}
يمكنك الآن التحديث Books.resolver.ts لتبدو مثل هذا:
يستورد {المحلل ، الاستعلام ، التبديل ، الوسيط ، المعرف} من"@ nestjs / graphql";
يستورد { كتاب } من"./book.model";
يستورد {BookService} من"./books.service";
يستورد {BookInput} من"./book.input";تضمين التغريدة(() => كتاب)
يصدّرفصل BookResolver {
البناء(خاص للقراءة فقط bookService: BookService) { }@طفره(() => كتاب)
غير متزامن إنشاء كتاب (تضمين التغريدة('مدخل') المدخلات: BookInput): يعد{
يعودهذا.bookService.create (إدخال) ؛
}@طفره(() => كتاب)
غير متزامن تحديث الكتاب (
تضمين التغريدة('بطاقة تعريف', { يكتب: () => فعلتُ: خيط,
تضمين التغريدة('مدخل') الإدخال: BookInput ،
): يعد{
يعودهذا.bookService.update (المعرف ، المدخلات) ؛
}
@طفره(() => كتاب)
غير متزامن حذف كتاب (تضمين التغريدة('بطاقة تعريف', { يكتب: () => فعلتُ: خيط): يعد{
يعودهذا.bookService.delete (معرف) ؛
}
}
و books.service.ts مثله:
يستورد {قابل للحقن} من"@ nestjs / مشترك";
يستورد {InjectModel} من"@ nestjs / النمس";
يستورد { نموذج } من'النمس';
يستورد {Book، BookDocument} من"./book.model";تضمين التغريدة()
يصدّرفصل خدمة الكتب {
البناء(تضمين التغريدة(اسم الكتاب) خاص نموذج الكتاب: نموذج) { }غير متزامن إنشاء (كتاب: كتاب): يعد
{
مقدار ثابت كتاب جديد = جديدهذا.bookModel (كتاب) ؛
يعود newBook.save () ،
}غير متزامن تحديث (المعرف: خيط، كتاب كتاب): يعد
{
يعودهذا.bookModel.findByIdAndUpdate (معرف ، كتاب ، { جديد: حقيقي }). exec () ؛
}
غير متزامنيمسح(بطاقة تعريف: خيط): يعد
{
يعودهذا.bookModel.findByIdAndDelete (id) .exec () ،
}
}
ال @طفره يحدد مصمم الديكور وظيفة كنوع طفرة و تضمين التغريدة يلتقط المصمم أي مدخلات يتم تمريرها إلى الوظيفة.
أخيرًا ، يجب عليك استيراد ملف الكتب داخل AppModule لجعلها عملية. يجب عليك أيضًا تمرير الكتب ل forRootAsync كما هو موضح أدناه.
يستورد {BooksModule} من"./books/books.module";
/**
* واردات أخرى
*/@وحدة({
الواردات: [
ConfigModule.forRoot ({
تحميل: [mongodbConfig] ،
isGlobal: حقيقي
}),
NestGraphQLModule.forRoot Async({
سائق: أبولو درايفر ،
حقن: [ConfigService] ،
useFactory: المصنع غير متزامن (configService: ConfigService) => ({
autoSchemaFile: Join (process.cwd () ، "src / schema.gql"),
installSubscription المعالجات: حقيقي,
الترتيب حقيقي,
ملعب: حقيقي,
التصحيح: configService.get <قيمة منطقية>("تصحيح"),
التحميلات: خطأ شنيع,
}),
}),
MongooseModule.forRootAsync ({
حقن: [ConfigService] ،
useFactory: المصنع غير متزامن (configService: ConfigService) => ({
uri: configService.get ("MONGO_URI")
})
}),
الكتب
],
وحدات التحكم: [AppController] ،
الموفرون: [AppService] ،
})
يصدّرفصل AppModule {}
يمكنك اختبار الكود عن طريق التشغيل بدء تشغيل npm: dev في جهازك ، ويجب أن يبدأ تطبيقك بنجاح من المنفذ 3000.
يفتح المضيف المحلي: 3000 / رسم بياني في متصفحك لإظهار ملف Graphiql واجهة حيث يمكنك اختبار الاستعلامات والطفرات. إليك مثال يوضح طلب بحث:
وإليك مثال على الطفرة:
قم ببناء واجهات برمجة تطبيقات فعالة باستخدام NestJS و GraphQL
يتضمن إنشاء واجهة برمجة تطبيقات GraphQL في NestJS مع MongoDB باستخدام Mongoose تحديد مخطط لواجهة GraphQL API ، وهو مخطط لنموذج Mongoose ، وهي خدمة للتفاعل مع قاعدة البيانات ، ومحلل لتعيين عمليات GraphQL للخدمة طُرق.
يحتوي NestJS على وظائف مدمجة لبناء واجهات برمجة التطبيقات ، بما في ذلك المصممين لتحديد المسارات ، والحراس لحمايتهم ، والأدوات الوسيطة للتعامل مع الطلبات والاستجابات. كما يدعم قواعد البيانات الأخرى مثل PostgreSQL و MySQL و SQLite ، بالإضافة إلى مكتبات GraphQL الأخرى مثل Apollo و TypeGraphQL.