- Оригинальный адрес:Sending Web Push Notifications from Node.js
- Оригинальный автор:code_barbarian
- Перевод с:Программа перевода самородков
- Постоянная ссылка на эту статью:GitHub.com/rare earth/gold-no…
- Переводчик:lsvih
- Корректор:talisk
использоватьservice workers APIПозволяет отправлять push-уведомления непосредственно из приложения Node.js в браузер Chrome.web-push
npm-модулиосвобождает вас отPubNubТакие посредники отправляют сообщения напрямую. В этой статье будет использоваться нативный JavaScript на интерфейсе и на сервере.ExpressПлатформа, которая проведет вас через пример уровня «Hello, World» того, как делать веб-push-уведомления. Окончательный эффект показан на рисунке ниже. Весь исходный код этого проекта можно найти по адресуGitHubПроверьте это.
Сервер аутентификации и конфигурации
Чтобы настроить веб-пуш, необходимо сначала создатьVAPID keys. Ключи VAPID используются для идентификации отправителя push-сообщения. нпмweb-push
Моды могутПомогает вам генерировать ключи VAPID, ниже мы установимweb-push
и его зависимости, и использоватьweb-push generate-vapid-keys
для создания ключей VAPID.
$ npm install express@4.16.3 web-push@3.3.0 body-parser@1.18.2 express-static@1.2.5
+ express@4.16.3
+ web-push@3.3.0
+ body-parser@1.18.2
+ express-static@1.2.5
added 62 packages in 1.42s
$
$ ./node_modules/.bin/web-push generate-vapid-keys
=======================================
Public Key:
BOynOrGhgkj8Bfk4hsFENAQYbnqqLSigUUkCNaBsAmNuH6U9EWywR1JIdxBVQOPDbIuTaj0tVAQbczNLkC5zftw
Private Key:
<OMITTED>
=======================================
$
Если вам нужна поддержка браузеров более ранних версий, также получитеGCM API key, но это не требуется в настольном Chrome 63 или более поздней версии.
Создать нижеindex.js
файл, содержащий ваш сервис. вам нужно использоватьrequire()
Импортируйте модуль web-push и настройте ключи VAPID прямо сейчас. Конфигурация довольно проста, сохраните ключи VAPID вPUBLIC_VAPID_KEY
иPRIVATE_VAPID_KEY
в переменной окружения.
const webpush = require('web-push');
const publicVapidKey = process.env.PUBLIC_VAPID_KEY;
const privateVapidKey = process.env.PRIVATE_VAPID_KEY;
// 此处换成你自己的邮箱
webpush.setVapidDetails('mailto:val@karpov.io', publicVapidKey, privateVapidKey);
Затем добавьте файл с именем/subscribe
конечная точка. JavaScript в браузере отправит тело, содержащееPushSubscription
объектHTTP-запрос. чтобы использоватьwebpush.sendNotification()
Для отправки push-уведомлений вам необходимо получитьPushSubscription
объект.
const app = express();
app.use(require('body-parser').json());
app.post('/subscribe', (req, res) => {
const subscription = req.body;
res.status(201).json({});
const payload = JSON.stringify({ title: 'test' });
console.log(subscription);
webpush.sendNotification(subscription, payload).catch(error => {
console.error(error.stack);
});
});
Выше приведены все настройки, которые необходимо выполнить на стороне сервера. ты сможешьGitHubОзнакомьтесь с полным кодом. Теперь мы собираемся создать клиентclient.js
с работником службы --worker.js
.
Клиенты и сервисные работники
Во-первых, используйтеexpress-static
npm-модули,Настройте экспресс-приложение, разверните статические ресурсы для клиента и разверните статические ресурсы в каталоге верхнего уровня службы.
Следует отметить, что при работе с/subscribe
вызовите это после маршрутизацииapp.use()
, иначе Express не будет обрабатывать маршрут согласно вашей конфигурации, а будет искатьsubscribe.html
документ.
app.use(require('express-static')('./'));
Далее, создатьindex.html
Документ, этот файл будет развернут как запись вашего приложения. Только ключ к файлу<script>
тег, который загрузит клиентский код JavaScript, остальное не имеет значения.
<html>
<head>
<title>Push Demo</title>
<script type="application/javascript" src="/client.js"></script>
</head>
<body>
Service Worker Demo
</body>
</html>
Теперь ваш портал готов. Создатьclient.js
документ.этот файлскажет браузеру инициализировать вашего работника службы и отправить/subscribe
Отправьте HTTP-запрос. Поскольку браузеры, поддерживающие сервис-воркеры, также должны поддерживать асинхронность и ожидание, в приведенном выше примере используетсяasync/await.
// 这里写死的 public key 要换成你自己的。
const publicVapidKey = 'BOynOrGhgkj8Bfk4hsFENAQYbnqqLSigUUkCNaBsAmNuH6U9EWywR1JIdxBVQOPDbIuTaj0tVAQbczNLkC5zftw';
if ('serviceWorker' in navigator) {
console.log('Registering service worker');
run().catch(error => console.error(error));
}
async function run() {
console.log('Registering service worker');
const registration = await navigator.serviceWorker.
register('/worker.js', {scope: '/'});
console.log('Registered service worker');
console.log('Registering push');
const subscription = await registration.pushManager.
subscribe({
userVisibleOnly: true,
// `urlBase64ToUint8Array()` 函数与以下网址中的描述一致
// https://www.npmjs.com/package/web-push#using-vapid-key-for-applicationserverkey
applicationServerKey: urlBase64ToUint8Array(publicVapidKey)
});
console.log('Registered push');
console.log('Sending push');
await fetch('/subscribe', {
method: 'POST',
body: JSON.stringify(subscription),
headers: {
'content-type': 'application/json'
}
});
console.log('Sent push');
}
Наконец, вам нужно реализоватьclient.js
загруженworker.js
документ.
В этом файле находится логика сервисного работника. Когда подписчик получает push-сообщение, сервис-воркер получаетсобытие "толчок".
console.log('Loaded service worker!');
self.addEventListener('push', ev => {
const data = ev.data.json();
console.log('Got push', data);
self.registration.showNotification(data.title, {
body: 'Hello, World!',
icon: 'http://mongoosejs.com/docs/images/mongoose5_62x30_transparent.png'
});
});
Хорошо! Настройте правильные переменные среды и запустите службу:
$ env PUBLIC_VAPID_KEY='OMITTED' env PRIVATE_VAPID_KEY='OMITTED' node .
Доступ в Chromehttp://localhost:3000
, вы должны увидеть push-уведомление ниже!
Это уведомление доступно не только в Chrome, но и вFirefoxЕго также можно реализовать с помощью того же кода.
Наконец
Веб-пуш — это простоservice workersодно из многих преимуществ. черезnpm-модули, вы можете отправлять уведомления в большинство современных браузеров. В следующий раз, когда вы захотите добавить push-уведомления в свое веб-приложение, не забудьте использовать сервис-воркеры!
Программа перевода самородковэто сообщество, которое переводит высококачественные технические статьи из ИнтернетаНаггетсДелитесь статьями на английском языке на . Охват контентаAndroid,iOS,внешний интерфейс,задняя часть,блокчейн,продукт,дизайн,искусственный интеллектЕсли вы хотите видеть более качественные переводы, пожалуйста, продолжайте обращать вниманиеПрограмма перевода самородков,официальный Вейбо,Знай колонку.