ویژگی تصویر

ارسال اعلان (Notification) در Node.js — راهنمای جامع

  /  Node.js   /  ارسال اعلان (Notification) در Node.js
بنر تبلیغاتی الف
NodeJS - 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 به‌همراه سیستم صف و مانیتورینگ، پوشش کامل سناریوهای اعلان را فراهم می‌کند. با رعایت بهترین شیوه‌ها می‌توانید تجربه کاربری قابل‌اعتماد و مقیاس‌پذیر بسازید.

آیا این مطلب برای شما مفید بود ؟

خیر
بله
موضوعات شما در انجمن: