"إذا أراد العامل أن يؤدي عمله بشكل جيد، فعليه أولاً أن يشحذ أدواته." - كونفوشيوس، "مختارات كونفوشيوس. لو لينجونج"
الصفحة الأمامية > برمجة > تنفيذ إشعارات الدفع باستخدام JavaScript: نهج على مستوى الإنتاج

تنفيذ إشعارات الدفع باستخدام JavaScript: نهج على مستوى الإنتاج

تم النشر بتاريخ 2024-11-08
تصفح:808

Implementing Push Notifications Using JavaScript: A Production-Grade Approach

في هذا المنشور، ستتعلم كيفية تنفيذ الإشعارات الفورية باستخدام JavaScript باتباع أفضل الممارسات على مستوى الإنتاج. أحد أفضل الأشياء هو أنني سأوفر لك بنية مجلد أيضًا، بحيث يمكنك إعداد مشروعك بسهولة.

يحتاج إعداد الإشعارات الفورية في تطبيق حقيقي إلى تخطيط دقيق. سأوضح لك كيفية إنشاء هذه الميزة في تطبيق Node.js الاحترافي. سنغطي أجزاء مهمة مثل كيفية تنظيم التعليمات البرمجية الخاصة بك، والحفاظ على أمان الأشياء، والتأكد من أنها تعمل بشكل جيد حتى مع نمو تطبيقك.

للبدء، أنت بحاجة إلى مكتبة لمساعدتك في إرسال الإشعارات من خادم Node.js الخاص بك. توفر مكتبة الدفع على الويب أدوات لإرسال الإشعارات وإدارة المفاتيح الضرورية.

1. إشعار الدفع: هيكل المشروع

أولاً، لنقم بإعداد هيكل المشروع للحفاظ على قاعدة تعليمات برمجية نظيفة وقابلة للتطوير:

/notification-service
├── /config
│   ├── default.js
│   └── production.js
├── /controllers
│   └── notificationController.js
├── /models
│   └── user.js
├── /routes
│   └── notificationRoutes.js
├── /services
│   ├── notificationService.js
│   ├── subscriptionService.js
│   └── webPushService.js
├── /utils
│   └── errorHandler.js
├── /tests
│   └── notification.test.js
├── app.js
├── package.json
├── .env
└── README.md

حزم NPM المطلوبة

قبل الغوص في التنفيذ، تأكد من تثبيت حزم NPM التالية:

  • express: إطار تطبيق ويب Node.js بسيط ومرن.
  • mongoose: مكتبة ODM (نمذجة بيانات الكائنات) لـ MongoDB وNode.js.
  • web-push: مكتبة لإرسال إشعارات الدفع باستخدام بروتوكول Web Push.
  • dotenv: وحدة نمطية خالية من التبعية تقوم بتحميل متغيرات البيئة من ملف .env.
  • supertest: مكتبة لاختبار تأكيدات HTTP في Node.js.

قم بتثبيت هذه الحزم باستخدام npm:

bash

npm install express mongoose web-push dotenv supertest

2. دفع الإخطار: تكوين المشروع

إنشاء ملفات تكوين لبيئات مختلفة (مثل التطوير والإنتاج). تقوم هذه الملفات بتخزين إعدادات خاصة بالبيئة.

// /config/default.js
module.exports = {
    server: {
        port: 3000,
        env: 'development'
    },
    pushNotifications: {
        publicVapidKey: process.env.VAPID_PUBLIC_KEY,
        privateVapidKey: process.env.VAPID_PRIVATE_KEY,
        gcmApiKey: process.env.GCM_API_KEY
    },
    db: {
        uri: process.env.MONGO_URI
    }
};
// /config/production.js
module.exports = {
    server: {
        port: process.env.PORT || 3000,
        env: 'production'
    },
    // Same structure as default, with production-specific values
};

3. نمذجة قاعدة البيانات

استخدم Mongoose لتحديد مخطط المستخدم واشتراكات الإشعارات.

// /models/user.js
const mongoose = require('mongoose');

const subscriptionSchema = new mongoose.Schema({
    endpoint: String,
    keys: {
        p256dh: String,
        auth: String
    }
});

const userSchema = new mongoose.Schema({
    email: { type: String, required: true, unique: true },
    subscriptions: [subscriptionSchema],
    preferences: {
        pushNotifications: { type: Boolean, default: true }
    }
});

module.exports = mongoose.model('User', userSchema);

4. خدمات الإشعارات

وحدة منطق التعامل مع الإشعارات في الخدمات.

// /services/webPushService.js
const webPush = require('web-push');
const config = require('config');

webPush.setVapidDetails(
    'mailto:[email protected]',
    config.get('pushNotifications.publicVapidKey'),
    config.get('pushNotifications.privateVapidKey')
);

module.exports = {
    sendNotification: async (subscription, payload) => {
        try {
            await webPush.sendNotification(subscription, JSON.stringify(payload));
        } catch (error) {
            console.error('Error sending notification', error);
        }
    }
};
// /services/notificationService.js
const User = require('../models/user');
const webPushService = require('./webPushService');

module.exports = {
    sendPushNotifications: async (userId, payload) => {
        const user = await User.findById(userId);
        if (user && user.preferences.pushNotifications) {
            user.subscriptions.forEach(subscription => {
                webPushService.sendNotification(subscription, payload);
            });
        }
    }
};

5. منطق التحكم

التعامل مع مسارات واجهة برمجة التطبيقات ودمج الخدمات.

// /controllers/notificationController.js
const notificationService = require('../services/notificationService');

exports.sendNotification = async (req, res, next) => {
    try {
        const { userId, title, body } = req.body;
        const payload = { title, body };
        await notificationService.sendPushNotifications(userId, payload);
        res.status(200).json({ message: 'Notification sent successfully' });
    } catch (error) {
        next(error);
    }
};

6. التوجيه

إعداد المسارات لواجهة برمجة التطبيقات (API) الخاصة بك.

// /routes/notificationRoutes.js
const express = require('express');
const router = express.Router();
const notificationController = require('../controllers/notificationController');

router.post('/send', notificationController.sendNotification);

module.exports = router;

7. معالجة الأخطاء

مركزية معالجة الأخطاء لضمان عدم تعطل التطبيق.

// /utils/errorHandler.js
module.exports = (err, req, res, next) => {
    console.error(err.stack);
    res.status(500).send({ error: 'Something went wrong!' });
};

8. نقطة إدخال التطبيق

تهيئة التطبيق والاتصال بقاعدة البيانات.

// app.js
const express = require('express');
const mongoose = require('mongoose');
const config = require('config');
const notificationRoutes = require('./routes/notificationRoutes');
const errorHandler = require('./utils/errorHandler');

const app = express();

app.use(express.json());
app.use('/api/notifications', notificationRoutes);
app.use(errorHandler);

mongoose.connect(config.get('db.uri'), {
    useNewUrlParser: true,
    useUnifiedTopology: true
})
    .then(() => console.log('MongoDB connected...'))
    .catch(err => console.error('MongoDB connection error:', err));

const PORT = config.get('server.port');
app.listen(PORT, () => console.log(`Server running in ${config.get('server.env')} mode on port ${PORT}`));

9. الممارسات الأمنية

  • متغيرات البيئة: قم بتخزين المعلومات الحساسة مثل مفاتيح واجهة برمجة التطبيقات ومعرِّفات URI لقاعدة البيانات في متغيرات البيئة.
  • HTTPS: قم بخدمة تطبيقك عبر HTTPS لتأمين الاتصال بين العملاء والخادم.
  • سياسة أمان المحتوى (CSP): تنفيذ رؤوس CSP لمنع هجمات البرمجة النصية عبر المواقع (XSS).
  • تحديد المعدل: استخدم البرامج الوسيطة مثل حد المعدل السريع لحماية واجهة برمجة التطبيقات الخاصة بك من هجمات القوة الغاشمة.

10. الاختبار

اكتب الاختبارات للتأكد من أن خدمتك تعمل كما هو متوقع في ظل ظروف مختلفة.

// /tests/notification.test.js
const request = require('supertest');
const app = require('../app');

describe('Notification API', () => {
    it('should send a notification', async () => {
        const res = await request(app)
            .post('/api/notifications/send')
            .send({ userId: 'someUserId', title: 'Test', body: 'This is a test' });
        expect(res.statusCode).toEqual(200);
        expect(res.body.message).toBe('Notification sent successfully');
    });
});

11. النشر في الإنتاج

  • خط أنابيب CI/CD: قم بإعداد خط أنابيب CI/CD باستخدام أدوات مثل Jenkins أو GitHub Actions أو GitLab CI لأتمتة اختبار التطبيق الخاص بك وإنشائه ونشره.
  • الحاويات: قم بإرساء تطبيقك لضمان الاتساق عبر بيئات مختلفة.
  • المراقبة: استخدم أدوات المراقبة مثل Prometheus وGrafana لتتبع صحة وأداء تطبيقك.

12. القياس

  • القياس الأفقي: انشر مثيلات متعددة لخدمتك خلف موازن التحميل للتعامل مع حركة المرور العالية.
  • قياس قاعدة البيانات: تنفيذ مجموعات التقسيم أو النسخ المتماثلة في MongoDB للقياس الأفقي لقاعدة البيانات الخاصة بك.

يضمن هذا الإعداد على مستوى الإنتاج أن نظام الإشعارات الفورية الخاص بك قابل للتطوير وآمن وقابل للصيانة. تم تنظيم الكود لدعم سهولة الاختبار والنشر والمراقبة، باتباع أفضل ممارسات الصناعة. إذا كان لديك أي أسئلة أخرى أو كنت بحاجة إلى تفاصيل تنفيذ محددة، فلا تتردد في طرحها!

بيان الافراج تم إعادة إنتاج هذه المقالة على: https://dev.to/shanu001x/implementing-push-notifications-using-javascript-a-production-grade-approach-1nmf?1 إذا كان هناك أي انتهاك، يرجى الاتصال بـ [email protected] لحذفه
أحدث البرنامج التعليمي أكثر>

تنصل: جميع الموارد المقدمة هي جزئيًا من الإنترنت. إذا كان هناك أي انتهاك لحقوق الطبع والنشر الخاصة بك أو الحقوق والمصالح الأخرى، فيرجى توضيح الأسباب التفصيلية وتقديم دليل على حقوق الطبع والنشر أو الحقوق والمصالح ثم إرسالها إلى البريد الإلكتروني: [email protected]. سوف نتعامل مع الأمر لك في أقرب وقت ممكن.

Copyright© 2022 湘ICP备2022001581号-3