ارسال اعلان (Notification) در Node.js
اعلانها (Notifications) بخش مهمی از هر برنامه مدرناند؛ چه بخواهید کاربر را از رویدادها باخبر کنید، چه اعلان تراکنشی یا پیامهای بلادرنگ. در این مقاله به الگوریتمها، تکنولوژیها و نمونههای عملی پیادهسازی اعلان در Node.js میپردازیم: Web Push (برای مرورگرها)، Firebase Cloud Messaging (برای موبایل و وب)، WebSocket/Socket.IO برای لحظهای و ایمیل/پیامک بهعنوان کانالهای مکمل.
انواع اعلانها و کاربردها
- Push Notifications (وب و موبایل): ارسال اعلان به دستگاه حتی زمانی که اپ باز نیست.
- Real-time Notifications (وبسوکت): اعلان بلادرنگ برای UIهای پویا.
- Email/SMS: اعلانهای مهم و قابل ردیابی که نیاز به تضمین دریافت دارند.
پیشنیازها و مفاهیم کلیدی
- Service Worker و Web Push API برای اعلانهای مرورگر
- VAPID keys برای احراز هویت Web Push
- Firebase Cloud Messaging (FCM) برای موبایل
- پایداری و retry، مدیریت سبد پیام (batching) و محدودیت نرخ (rate limiting)
مثال 1 — ارسال Web Push با کتابخانه web-push
const webpush = require('web-push');
// تولید کلیدهای VAPID (یکبار اجرا کنید)
const vapidKeys = webpush.generateVAPIDKeys();
console.log(vapidKeys);
// مقداردهی اولیه
webpush.setVapidDetails(
'mailto:admin@example.com',
process.env.VAPID_PUBLIC_KEY,
process.env.VAPID_PRIVATE_KEY
);
// فرض کنید subscription از فرانتاند ذخیره شده
const subscription = {
endpoint: 'https://fcm.googleapis.com/fcm/send/...',
keys: {
p256dh: '...',
auth: '...'
}
};
const payload = JSON.stringify({ title: 'سلام', body: 'پیام تست' });
webpush.sendNotification(subscription, payload)
.then(response => console.log('Sent:', response.statusCode))
.catch(err => console.error('Error:', err));توضیح: این کد نشان میدهد چگونه با کتابخانه web-push اعلان وب ارسال کنید. ابتدا کلیدهای VAPID را تولید یا از تنظیمات محیطی بارگزاری کنید. subscription از مرورگر کاربر (Service Worker) گرفته میشود و در سرور ذخیره میشود. sendNotification پیام را به endpoint ارسال میکند. در عمل باید خطاها را مدیریت، محدودیت نرخ را رعایت و پیامها را بهصورت batch ارسال کنید.
مثال 2 — ارسال اعلان با Firebase Cloud Messaging (FCM)
const admin = require('firebase-admin');
const serviceAccount = require('./serviceAccountKey.json');
admin.initializeApp({
credential: admin.credential.cert(serviceAccount)
});
const registrationToken = 'DEVICE_REGISTRATION_TOKEN';
const message = {
notification: {
title: 'تراکنش جدید',
body: 'سفارش شما ارسال شد'
},
data: { orderId: '12345' },
token: registrationToken
};
admin.messaging().send(message)
.then((response) => {
console.log('Successfully sent message:', response);
})
.catch((error) => {
console.log('Error sending message:', error);
});توضیح: این نمونه از پکیج firebase-admin برای ارسال نوتیفیکیشن به دستگاههای موبایل (یا وب با FCM) استفاده میکند. فایل serviceAccountKey.json را از کنسول Firebase دانلود کنید. message میتواند شامل بخش notification (برای نمایش) و data (برای پردازش داخل اپ) باشد. در محیط تولید از error handling، retry و مدیریت توکِنهای منقضی استفاده کنید.
مثال 3 — اعلان بلادرنگ با Socket.IO
/* server.js */const http = require('http');
const express = require('express');
const { Server } = require('socket.io');
const app = express();
const server = http.createServer(app);
const io = new Server(server);
io.on('connection', (socket) => {
console.log('Client connected', socket.id);
// ارسال اعلان اختصاصی
socket.on('subscribe', (room) => {
socket.join(room);
});
});
function notifyRoom(room, payload) {
io.to(room).emit('notification', payload);
}
server.listen(3000);توضیح: این سرور با Socket.IO یک کانال بلادرنگ برای ارسال اعلانها فراهم میکند. روی اتصال کاربر میتوان او را به «اتاق» دلخواه افزود و سپس با notifyRoom به همه اعضا اعلان فرستاد. این روش مناسب اعلانهای آنی داخل اپوب است، اما برای زمانی که کاربر آفلاین است باید از push یا صفهای پیام استفاده کنید.
مثال 4 — ارسال ایمیل با Nodemailer (به عنوان کانال مکمل)
const nodemailer = require('nodemailer');
const transporter = nodemailer.createTransport({
host: 'smtp.example.com',
port: 587,
secure: false,
auth: {
user: process.env.SMTP_USER,
pass: process.env.SMTP_PASS
}
});
const mailOptions = {
from: '"MyApp" ',
to: 'user@example.com',
subject: 'اعلان مهم',
text: 'متن اعلان'
};
transporter.sendMail(mailOptions)
.then(info => console.log('Email sent:', info.messageId))
.catch(err => console.error('Email error:', err));توضیح: Nodemailer برای ارسال ایمیلهای اعلان، تأیید و گزارش مناسب است. برای ارسالهای حجم بالا از سرویسهای اختصاصی (SendGrid، Mailgun) استفاده کنید و به ملاحظات deliverability (SPF/DKIM) توجه داشته باشید.
مقایسه روشها
| روش | مزایا | معایب |
|---|---|---|
| Web Push | دستگاه حتی در پسزمینه | نیاز به Service Worker و VAPID |
| FCM | پشتیبانی موبایل قوی، قابلیت آمار | وابستگی به سرویس گوگل |
| Socket.IO / WebSocket | بلادرنگ، تعاملی | وابسته به اتصال زنده؛ آفلاین کار نمیکند |
| Email / SMS | قابل اطمینان برای پیامهای مهم | هزینه و تاخیر بیشتر |
بهترین شیوهها و نکات امنیتی
- کلیدها و گواهیها را در متغیرهای محیطی نگه دارید (VAPID, Firebase keys, SMTP credentials).
- پیامها را در صف (مثلاً با Bull یا RabbitMQ) قرار دهید تا retry و rate-limiting مدیریت شود.
- برای Web Push از VAPID استفاده و endpointها را بهدرستی اعتبارسنجی کنید.
- برای موبایل توکنها را مرتب پاکسازی کنید (Expired/Invalid tokens).
- تنظیمات GDPR و حریم خصوصی: رضایت کاربر (opt-in) را پیاده کنید و راه لغو اشتراک فراهم کنید.
نتیجهگیری کوتاه
ارسال اعلان در Node.js شامل انتخاب کانال مناسب، امنیت و مدیریت وضعیتهای آفلاین است. ترکیب Web Push، FCM و WebSocket بههمراه سیستم صف و مانیتورینگ، پوشش کامل سناریوهای اعلان را فراهم میکند. با رعایت بهترین شیوهها میتوانید تجربه کاربری قابلاعتماد و مقیاسپذیر بسازید.
آیا این مطلب برای شما مفید بود ؟




