Nodejs网页推送通知模块node-web-push的使用

Nodejs网页推送通知模块node-web-push的使用
node-web-push 是一个在 Node.js 中实现 Web 推送通知功能的库。它可以帮助你在服务器端发送推送通知到客户端浏览器。下面是如何使用 node-web-push 的步骤和示例代码。

1. 安装 node-web-push

首先,你需要安装 node-web-push 库:

npm install node-web-push

2. 注册 VAPID 密钥

Web 推送通知需要一个 VAPID 密钥对来验证你的服务器身份。你可以使用任何工具生成 VAPID 密钥对,比如 OpenSSL:

openssl ecparam -genkey -name prime256v1 -noout -out private_key.pem
openssl ec -in private_key.pem -pubout -out public_key.pem

然后读取这些密钥文件的内容,并将其转换为 Base64 编码的字符串。

3. 初始化 node-web-push

在你的 Node.js 项目中初始化 node-web-push,并设置 VAPID 密钥:

const webpush = require('node-web-push');

// 设置 VAPID 密钥
webpush.setVapidDetails(
  'mailto:your-email@example.com', // 发件人电子邮件
  'YOUR_PUBLIC_VAPID_KEY',         // 公钥
  'YOUR_PRIVATE_VAPID_KEY'         // 私钥
);

4. 订阅处理

当用户订阅推送通知时,前端会向后端发送一个包含订阅信息的对象。这个对象包含了用户的订阅信息,包括端点(endpoint)、公钥(keys.p256dh)和加密密钥(keys.auth)。

5. 发送推送通知

一旦你有了用户的订阅信息,就可以发送推送通知了:

const subscription = {
  endpoint: 'THE_USER_ENDPOINT',
  keys: {
    p256dh: 'THE_USER_P256DH_KEY',
    auth: 'THE_USER_AUTH_KEY'
  }
};

const payload = JSON.stringify({ title: 'Hello, World!' });

webpush.sendNotification(subscription, payload)
  .catch(err => console.error('Error sending notification:', err));

6. 错误处理

确保处理所有可能的错误,例如订阅过期或无效的情况。

示例:完整的服务器端代码

const express = require('express');
const webpush = require('node-web-push');

const app = express();

// 设置 VAPID 密钥
webpush.setVapidDetails(
  'mailto:your-email@example.com',
  'YOUR_PUBLIC_VAPID_KEY',
  'YOUR_PRIVATE_VAPID_KEY'
);

app.use(express.json());

app.post('/send-notification', (req, res) => {
  const subscription = req.body.subscription;
  const payload = JSON.stringify(req.body.payload);

  webpush.sendNotification(subscription, payload)
    .then(() => res.status(200).json({ message: 'Notification sent successfully.' }))
    .catch(err => {
      console.error('Error sending notification:', err);
      res.status(500).json({ error: 'Failed to send notification.' });
    });
});

app.listen(3000, () => console.log('Server running on port 3000'));

这段代码创建了一个简单的 Express 服务器,它监听 /send-notification 路由,接收订阅信息和消息内容,并尝试发送推送通知。

前端代码

在前端,你需要使用 serviceWorkerRegistration 来获取用户的订阅信息:

navigator.serviceWorker.ready.then(function(registration) {
  registration.pushManager.getSubscription()
    .then(function(subscription) {
      if (!subscription) {
        // 用户未订阅,可以引导用户订阅
      } else {
        // 发送订阅信息到服务器
        fetch('/send-notification', {
          method: 'POST',
          body: JSON.stringify({
            subscription: subscription,
            payload: { title: 'Hello, World!' }
          })
        });
      }
    });
});

这样,你就完成了基本的 Web 推送通知功能的实现。


3 回复

当然,要使用 node-web-push 模块来实现网页推送通知,你可以按照以下步骤操作:

  1. 安装模块:首先,你需要在你的 Node.js 项目中安装 node-web-push。打开终端,运行:

    npm install node-web-push --save
    
  2. 注册服务工作线程:在客户端(浏览器)上,你需要注册一个服务工作线程,并请求推送权限。这通常通过 JavaScript 完成。

  3. 服务器端设置:在服务器端,你需要生成 VAPID 密钥对,并配置 node-web-push 使用这些密钥。例如:

    const webpush = require('node-web-push');
    
    // 生成VAPID密钥对
    const vapidKeys = webpush.generateVAPIDKeys();
    console.log(vapidKeys); // 保存这些密钥用于后续
    
    webpush.setVapidDetails(
      'mailto:your-email@example.com', // 替换为你的邮件地址
      vapidKeys.publicKey,
      vapidKeys.privateKey
    );
    
  4. 发送推送通知:一旦配置完成,你可以使用订阅信息发送推送通知。例如:

    webpush.sendNotification(subscription, 'Hello World!').catch(err => console.error(err));
    

记得替换示例中的电子邮件和密钥为你自己的信息。这样,你就能够开始使用 node-web-push 发送网页推送通知了!


node-web-push 是一个用于在 Node.js 应用中实现 Web 推送通知功能的库。以下是如何使用 node-web-push 的基本步骤:

1. 安装 node-web-push

首先你需要安装 node-web-push 包,可以通过 npm 来安装:

npm install --save node-web-push

2. 注册 VAPID 密钥

VAPID(Voluntary Application Server Identification)密钥对是用来认证你的应用服务器的,这是发送推送通知所必需的。你可以通过以下方式生成:

const webpush = require('web-push');

const vapidKeys = webpush.generateVAPIDKeys();
console.log(vapidKeys);

这将输出类似如下的内容:

{
  publicKey: 'BC...',
  privateKey: 'YgQ...'
}

3. 设置推送服务

接下来你需要设置推送服务,配置你的公钥和私钥:

webpush.setVapidDetails(
    'mailto:your-email@example.com', // 发送者的联系信息
    'BC...', // VAPID 公钥
    'YgQ...' // VAPID 私钥
);

4. 处理订阅

当用户同意接收通知时,你需要从客户端获取订阅信息,并存储它以便将来发送通知。

客户端代码示例 (JavaScript)

<script>
  if ('serviceWorker' in navigator) {
    navigator.serviceWorker.register('/sw.js').then(function(registration) {
      console.log('Service Worker registered with scope:', registration.scope);
      
      // 请求权限
      Notification.requestPermission().then(permission => {
        if (permission === "granted") {
          navigator.serviceWorker.ready.then(function(serviceWorkerRegistration) {
            serviceWorkerRegistration.pushManager.subscribe({userVisibleOnly: true})
              .then(function(subscription) {
                console.log('Subscription successful!', subscription);
                // 将 subscription 传递给服务器
                fetch('/subscribe', {
                  method: 'POST',
                  body: JSON.stringify(subscription),
                  headers: {
                    'Content-type': 'application/json'
                  }
                });
              })
              .catch(function(e) {
                if (Notification.permission === 'denied') {
                  console.warn('Push messaging is denied.');
                } else {
                  console.error('Unable to subscribe to push.', e);
                }
              });
          });
        }
      });
    }).catch(function(error) {
      console.error('Service Worker registration failed:', error);
    });
  }
</script>

服务器端代码示例 (Node.js)

app.post('/subscribe', (req, res) => {
  const subscription = req.body;
  
  // 存储 subscription 对象到数据库或其它存储系统
  
  res.status(201).json({});
});

5. 发送推送通知

最后,当你需要向客户端发送推送通知时,可以使用 webpush.sendNotification 方法:

webpush.sendNotification(subscription, 'Hello World!')
  .catch(err => console.error(err));

以上就是使用 node-web-push 实现网页推送通知的基本流程。注意,为了简化演示,这里省略了一些错误处理和生产环境的安全措施,实际部署时应考虑这些因素。

node-web-push 是一个用于Node.js的库,帮助你实现网页推送通知功能。首先,你需要注册Google Cloud Messaging (GCM) 或 Web Push服务来获取VAPID公钥和私钥。然后,在你的服务器代码中安装 node-web-push 库,并配置公私钥。

客户端需要用户的许可来接收推送通知,通过 serviceWorkerRegistration.pushManager.subscribe() 方法订阅通知。最后,使用 node-web-pushsendNotification() 方法将消息发送给用户。详细步骤和代码示例可以参考官方文档。

回到顶部