Melaksanakan Pemberitahuan Tolak Menggunakan JavaScript: Pendekatan Gred Pengeluaran

WBOY
Lepaskan: 2024-08-17 13:05:02
asal
199 orang telah melayarinya

Implementing Push Notifications Using JavaScript: A Production-Grade Approach

Dalam siaran ini, anda akan belajar cara melaksanakan pemberitahuan tolak menggunakan JavaScript dengan mengikuti amalan terbaik gred pengeluaran. Salah satu perkara terbaik ialah saya akan menyediakan struktur folder juga, supaya anda boleh menyediakan projek anda dengan mudah.

Menyediakan pemberitahuan tolak dalam apl dunia sebenar memerlukan perancangan yang teliti. Saya akan menunjukkan kepada anda cara membina ciri ini dalam apl Node.js profesional. Kami akan merangkumi bahagian penting seperti cara mengatur kod anda, memastikan perkara itu selamat dan memastikan ia berfungsi dengan baik walaupun apl anda berkembang.

Untuk bermula, anda memerlukan perpustakaan untuk membantu anda menghantar pemberitahuan tolak daripada pelayan Node.js anda. Pustaka push web menyediakan alatan untuk menghantar pemberitahuan dan mengurus kekunci yang diperlukan.

1. Pemberitahuan Tolak: Struktur Projek

Mula-mula, mari sediakan struktur projek untuk mengekalkan pangkalan kod yang bersih dan berskala:

/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
Salin selepas log masuk

Pakej NPM yang Diperlukan

Sebelum menyelami pelaksanaan, pastikan anda memasang pakej NPM berikut:

  • express: Rangka kerja aplikasi web Node.js yang minimum dan fleksibel.
  • mongoose: Pustaka ODM (Pemodelan Data Objek) untuk MongoDB dan Node.js.
  • web-push: Perpustakaan untuk menghantar pemberitahuan push menggunakan Web Push Protocol.
  • dotenv: Modul kebergantungan sifar yang memuatkan pembolehubah persekitaran daripada fail .env.
  • supertest: Pustaka untuk menguji pernyataan HTTP dalam Node.js.

Pasang pakej ini menggunakan npm:

bash npm install express mongoose web-push dotenv supertest
Salin selepas log masuk

2. Pemberitahuan Tolak: Konfigurasi Projek

Buat fail konfigurasi untuk persekitaran yang berbeza (cth., pembangunan, pengeluaran). Fail ini menyimpan tetapan khusus persekitaran.

// /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 } };
Salin selepas log masuk
// /config/production.js module.exports = { server: { port: process.env.PORT || 3000, env: 'production' }, // Same structure as default, with production-specific values };
Salin selepas log masuk

3.Memodelkan Pangkalan Data

Gunakan Mongoose untuk mentakrifkan skema pengguna anda dan langganan pemberitahuan.

// /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);
Salin selepas log masuk

4.Perkhidmatan Pemberitahuan

Modularkan logik untuk mengendalikan pemberitahuan ke dalam perkhidmatan.

// /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); } } };
Salin selepas log masuk
// /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); }); } } };
Salin selepas log masuk

5.Logik Pengawal

Kendalikan laluan API dan integrasikan perkhidmatan.

// /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); } };
Salin selepas log masuk

6.Penghalaan

Sediakan laluan untuk API anda.

// /routes/notificationRoutes.js const express = require('express'); const router = express.Router(); const notificationController = require('../controllers/notificationController'); router.post('/send', notificationController.sendNotification); module.exports = router;
Salin selepas log masuk

7.Pengendalian Ralat

Memusatkan pengendalian ralat untuk memastikan apl tidak ranap.

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

8.Titik Kemasukan Permohonan

Mulakan aplikasi dan sambungkan ke pangkalan data.

// 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}`));
Salin selepas log masuk

9.Amalan Keselamatan

  • Pembolehubah Persekitaran: Simpan maklumat sensitif seperti kunci API dan URI pangkalan data dalam pembolehubah persekitaran.
  • HTTPS: Layan aplikasi anda melalui HTTPS untuk menjamin komunikasi antara pelanggan dan pelayan.
  • Dasar Keselamatan Kandungan (CSP): Laksanakan pengepala CSP untuk mengelakkan serangan skrip merentas tapak (XSS).
  • Penghadan Kadar: Gunakan perisian tengah seperti had kadar-ekspres untuk melindungi API anda daripada serangan kekerasan.

10.Ujian

Tulis ujian untuk memastikan perkhidmatan anda berfungsi seperti yang diharapkan dalam pelbagai keadaan.

// /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'); }); });
Salin selepas log masuk

11.Mengerahkan ke Pengeluaran

  • CI/CD Pipeline: Sediakan saluran paip CI/CD menggunakan alatan seperti Jenkins, GitHub Actions atau GitLab CI untuk mengautomasikan ujian, membina dan menggunakan aplikasi anda.
  • Pebekalan: Dockerize aplikasi anda untuk memastikan konsistensi merentas persekitaran yang berbeza.
  • Pemantauan: Gunakan alat pemantauan seperti Prometheus dan Grafana untuk menjejaki kesihatan dan prestasi aplikasi anda.

12.Penskalaan

  • Penskalaan Mendatar: Gunakan berbilang contoh perkhidmatan anda di belakang pengimbang beban untuk mengendalikan trafik yang tinggi.
  • Penskalaan Pangkalan Data: Laksanakan set sharding atau replika dalam MongoDB untuk penskalaan mendatar pangkalan data anda.

Persediaan gred pengeluaran ini memastikan sistem pemberitahuan tolak anda boleh skala, selamat dan boleh diselenggara. Kod ini disusun untuk menyokong ujian mudah, penggunaan dan pemantauan, mengikut amalan terbaik industri. Jika anda mempunyai sebarang soalan lanjut atau memerlukan butiran pelaksanaan khusus, jangan ragu untuk bertanya!

Atas ialah kandungan terperinci Melaksanakan Pemberitahuan Tolak Menggunakan JavaScript: Pendekatan Gred Pengeluaran. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

sumber:dev.to
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan
Tentang kita Penafian Sitemap
Laman web PHP Cina:Latihan PHP dalam talian kebajikan awam,Bantu pelajar PHP berkembang dengan cepat!