منذ بعض الوقت كنت أعمل على تطبيق للهاتف المحمول ، وشملت وظيفته محادثة مريحة عبر الإنترنت. والآن قررت أن أكتب مقالًا يحتوي على إرشادات موجزة حول كيفية إنشاء محادثة باستخدام خادم apollo و node.js على الواجهة الخلفية ، بالإضافة إلى رد فعل العميل الأصلي و apollo على جانب العميل.
المقالة مقسمة إلى قسمين لسهولة القراءة. يحتوي الجزء الأول على دليل لإنشاء الواجهة الخلفية للتطبيق ، بينما يحتوي الجزء الثاني على دليل لإنشاء الواجهة الأمامية للتطبيق.
إذا كنت كسولًا جدًا في القراءة ، فيمكنك رؤية الشفرة في Github'e على الفور 
هنا وهنا .
باعتبارها التقنيات الرئيسية للتطبيق ، اخترت node.js framework 
koa ، وقاعدة بيانات 
postgresql ، وكذلك خادم GraphQL - 
apollo-server-koa .
بادئ ذي بدء ، تم إنشاء مشروع koa2 فارغ ، ولهذا استخدمت 
مولد koa بسيطًا 
عن طريق تنفيذ الأمر في المحطة الطرفية:
$ koa <project name> 
ثم تم تثبيت التبعيات اللازمة ، أفعل ذلك مع الغزل ، ولكن يمكنك استخدام npm.
 $ yarn add apollo-server-koa knex objection pg 
يتم تثبيت جميع المكتبات اللازمة ، والآن يمكنك كتابة التعليمات البرمجية
للاتصال بقاعدة البيانات ، تحتاج إلى وصف ملفين ، الأول هو db.js ، والذي سيقوم بتصدير مثيل عميل knex ويسمح لنماذجنا بالعمل مع البيانات من قاعدة البيانات ، والثاني هو knexfile.js ، والذي يحتوي على إعدادات اتصال قاعدة البيانات لإنشاء و الهجرات المتداوله.
موصوفة أدناه رمز db.js ، لاحظ أن كافة الإعدادات مأخوذة من متغيرات البيئة: const db = require('knex')({ client: 'pg', connection: {   host : process.env.POSTGRES_HOST,   port: process.env.POSTGRES_PORT,   user : process.env.POSTGRES_USER,   password : process.env.POSTGRES_PASSWORD,   database : process.env.POSTGRES_DATABASE } }); module.exports = db; 
رمز knexfile.js متاح 
هنا .
يمكنك الآن وصف عمليات الترحيل لإنشاء الجدولين اللذين نحتاجهما.
ستكون الجداول نفسها بسيطة قدر الإمكان وتحتوي فقط على الحد الأدنى المطلوب من الحقول. أمر إنشائها أدناه:
 $ knex migrate:make migration_name 
يمكنك عرض ملفات الترحيل 
هنا .
الآن إنشاء نماذج الكيان رسالة والمستخدم
 class Message extends Model { static get tableName() {   return 'messages'; } $beforeInsert() {   this.created_at = new Date().toISOString(); } static get relationMappings() {   return {     user: {       relation: Model.BelongsToOneRelation,       modelClass: User,       join: {         from: 'messages.user_id',         to: 'users.id'       }     }   }; } } 
بقي الشيء الأكثر إثارة للاهتمام - الاتصال وتكوين apollo-server-koa ، ووصف مخططات graphql والمحللات.
للاتصال apollo-server-koa ، ما عليك سوى إضافة سطور التعليمات البرمجية التالية
app.js: const { ApolloServer } = require('apollo-server-koa'); const graphqlSchema = require('./graphqlSchema'); … const apolloServer = new ApolloServer(graphqlSchema); apolloServer.applyMiddleware({ app }); 
شبكة الاتصالات العالمية: var { app, apolloServer } = require('../app'); ... apolloServer.installSubscriptionHandlers(server); 
بالإضافة إلى توصيل apollo-server-koa ، قمنا بتضمين القدرة على العمل مع الاشتراكات لإعلام العملاء بأن رسالة جديدة قد وصلت إلى الدردشة.
Apollo-server-koa متصل ، والخطوة التالية هي وصف الرسم البياني graphql مع الأنواع اللازمة للدردشة
 input UserInput { username: String! } input MessageInput { text: String! user_id: ID! } type User { id: ID username: String } type Message { id: ID text: String created_at: String user: User } type Query { getLast100Messages: [Message] } type Mutation { findOrCreateUser(user: UserInput!): User createMessage(message: MessageInput!): Message } type Subscription { messageCreated: Message } 
الدائرة جاهزة ، ونحن تصف الحلول
مثال لمحلل لإرسال رسالة جديدة: const Message = require('../../models/message'); const { pubsub, MESSAGE_CREATED } = require('../../utils'); module.exports = { createMessage: async (obj, { message }, context, info) => {   const createdMessage = await Message     .query()     .insert(message);   const resultMessage = await Message     .query()     .eager('user')     .findById(createdMessage.id);   pubsub.publish(MESSAGE_CREATED, { messageCreated: resultMessage });   return resultMessage; }, }; 
هناك نقطة مهمة تتمثل في أنه بالإضافة إلى حفظ الرسالة في قاعدة البيانات ، يتم استدعاء وظيفة publish () هنا ، والتي تُعلم جميع المشتركين بالحدث MESSAGE_CREATED ، وترسل لهم موضوع رسالة جديدة (سيُلاحظ القارئ المنتبه أنه سيتم أيضًا إخطار المرسل برسالة جديدة ، وسنقوم بمعالجة هذه الرسالة بشكل إضافي على للعميل ، في مشروع حقيقي ، من المنطقي معالجة ذلك على الجانب الخلفي ، حتى لا يكرر المنطق بين العملاء المختلفين).
يمكن العثور على رمز باقي أدوات الحل 
هنا .
جانب الخادم للدردشة جاهز ، وكيفية التحقق من أن كل شيء يعمل؟
افتح 
المضيف في متصفحك وسترى ملعب graphql فيه.
 في الجزء التالي ،
في الجزء التالي ، سننشئ تطبيقًا للهاتف المحمول.