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.
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
Sebelum menyelami pelaksanaan, pastikan anda memasang pakej NPM berikut:
bash npm install express mongoose web-push dotenv supertest
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 } };
// /config/production.js module.exports = { server: { port: process.env.PORT || 3000, env: 'production' }, // Same structure as default, with production-specific values };
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);
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); } } };
// /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); }); } } };
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); } };
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;
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!' }); };
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}`));
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'); }); });
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!