In diesem Beitrag erfahren Sie, wie Sie Push-Benachrichtigungen mithilfe von JavaScript implementieren, indem Sie Best Practices für die Produktion befolgen. Das Beste ist, dass ich auch eine Ordnerstruktur zur Verfügung stelle, damit Sie Ihr Projekt einfach einrichten können.
Das Einrichten von Push-Benachrichtigungen in einer realen App erfordert sorgfältige Planung. Ich zeige Ihnen, wie Sie diese Funktion in einer professionellen Node.js-App erstellen. Wir behandeln wichtige Aspekte wie die Organisation Ihres Codes, die Sicherheit und die Sicherstellung, dass er auch dann gut funktioniert, wenn Ihre App wächst.
Um zu beginnen, benötigen Sie eine Bibliothek, die Sie beim Senden von Push-Benachrichtigungen von Ihrem Node.js-Server unterstützt. Die Web-Push-Bibliothek stellt Tools zum Versenden von Benachrichtigungen und zum Verwalten der erforderlichen Schlüssel bereit.
Lassen Sie uns zunächst die Projektstruktur einrichten, um eine saubere und skalierbare Codebasis zu gewährleisten:
/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
Bevor Sie mit der Implementierung beginnen, stellen Sie sicher, dass die folgenden NPM-Pakete installiert sind:
bash npm install express mongoose web-push dotenv supertest
Erstellen Sie Konfigurationsdateien für verschiedene Umgebungen (z. B. Entwicklung, Produktion). In diesen Dateien werden umgebungsspezifische Einstellungen gespeichert.
// /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 };
Verwenden Sie Mongoose, um Ihr Benutzerschema und Ihre Benachrichtigungsabonnements zu definieren.
// /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);
Modularisieren Sie die Logik für die Verarbeitung von Benachrichtigungen in Dienste.
// /services/webPushService.js const webPush = require('web-push'); const config = require('config'); webPush.setVapidDetails( 'mailto:example@yourdomain.org', 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); }); } } };
API-Routen verarbeiten und Dienste integrieren.
// /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); } };
Richten Sie Routen für Ihre API ein.
// /routes/notificationRoutes.js const express = require('express'); const router = express.Router(); const notificationController = require('../controllers/notificationController'); router.post('/send', notificationController.sendNotification); module.exports = router;
Zentralisieren Sie die Fehlerbehandlung, um sicherzustellen, dass die App nicht abstürzt.
// /utils/errorHandler.js module.exports = (err, req, res, next) => { console.error(err.stack); res.status(500).send({ error: 'Something went wrong!' }); };
Initialisieren Sie die Anwendung und stellen Sie eine Verbindung zur Datenbank her.
// 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}`));
Schreiben Sie Tests, um sicherzustellen, dass Ihr Dienst unter verschiedenen Bedingungen wie erwartet funktioniert.
// /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'); }); });
Dieses produktionstaugliche Setup stellt sicher, dass Ihr Push-Benachrichtigungssystem skalierbar, sicher und wartbar ist. Der Code ist so organisiert, dass er einfaches Testen, Bereitstellen und Überwachen unterstützt und dabei den Best Practices der Branche folgt. Wenn Sie weitere Fragen haben oder spezifische Implementierungsdetails benötigen, fragen Sie uns gerne!
Das obige ist der detaillierte Inhalt vonImplementieren von Push-Benachrichtigungen mit JavaScript: Ein produktionstauglicher Ansatz. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!