«Если рабочий хочет хорошо выполнять свою работу, он должен сначала заточить свои инструменты» — Конфуций, «Аналитики Конфуция. Лу Лингун»
титульная страница > программирование > Реализация push-уведомлений с использованием JavaScript: подход промышленного уровня

Реализация push-уведомлений с использованием JavaScript: подход промышленного уровня

Опубликовано 8 ноября 2024 г.
Просматривать:433

Implementing Push Notifications Using JavaScript: A Production-Grade Approach

В этом посте вы узнаете, как реализовать push-уведомления с помощью JavaScript, следуя передовым практикам производственного уровня. Самое приятное то, что я также предоставлю структуру папок, чтобы вы могли легко настроить свой проект.

Настройка push-уведомлений в реальном приложении требует тщательного планирования. Я покажу вам, как реализовать эту функцию в профессиональном приложении Node.js. Мы рассмотрим важные части, например, как организовать ваш код, обеспечить его безопасность и убедиться, что он работает хорошо даже по мере роста вашего приложения.

Для начала вам понадобится библиотека, которая поможет отправлять push-уведомления с вашего сервера Node.js. Библиотека web-push предоставляет инструменты для отправки уведомлений и управления необходимыми ключами.

1. Push-уведомление: структура проекта

Во-первых, давайте настроим структуру проекта для поддержания чистой и масштабируемой базы кода:

/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: библиотека для отправки push-уведомлений с использованием протокола Web Push.
  • dotenv: модуль с нулевой зависимостью, который загружает переменные среды из файла .env.
  • supertest: библиотека для тестирования утверждений HTTP в Node.js.

Установите эти пакеты с помощью npm:

bash

npm install express mongoose web-push dotenv supertest

2. Push-уведомление: конфигурация проекта

Создавайте файлы конфигурации для различных сред (например, разработки, производства). В этих файлах хранятся настройки, специфичные для среды.

// /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. Логика контроллера

Обработка маршрутов API и интеграция сервисов.

// /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. Методы безопасности

  • Переменные среды: храните конфиденциальную информацию, такую ​​как ключи API и URI базы данных, в переменных среды.
  • HTTPS: обслуживайте свое приложение через HTTPS для обеспечения безопасности связи между клиентами и сервером.
  • Политика безопасности контента (CSP): внедрите заголовки CSP для предотвращения атак с использованием межсайтовых сценариев (XSS).
  • Ограничение скорости: используйте промежуточное программное обеспечение, такое как express-rate-limit, чтобы защитить ваш API от атак методом перебора.

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 для горизонтального масштабирования вашей базы данных.

Эта настройка промышленного уровня гарантирует, что ваша система push-уведомлений будет масштабируемой, безопасной и удобной в обслуживании. Код организован таким образом, чтобы обеспечить простоту тестирования, развертывания и мониторинга в соответствии с лучшими отраслевыми практиками. Если у вас есть дополнительные вопросы или вам нужны конкретные подробности реализации, не стесняйтесь спрашивать!

Заявление о выпуске Эта статья воспроизведена по адресу: https://dev.to/shanu001x/implementing-push-notifications-using-javascript-a-production-grade-approach-1nmf?1 Если есть какие-либо нарушения, пожалуйста, свяжитесь с [email protected] удалить его
Последний учебник Более>

Изучайте китайский

Отказ от ответственности: Все предоставленные ресурсы частично взяты из Интернета. В случае нарушения ваших авторских прав или других прав и интересов, пожалуйста, объясните подробные причины и предоставьте доказательства авторских прав или прав и интересов, а затем отправьте их по электронной почте: [email protected]. Мы сделаем это за вас как можно скорее.

Copyright© 2022 湘ICP备2022001581号-3