PWA之推送伺服器(koa2+mysql+pm2)

象棋發表於2019-03-02

概念

Progressive Web Apps 是漸進式Web應用程式,執行在現代瀏覽器並展現出超級能力。支援可發現,可安裝,離線執行,訊息推送等APP特有的能力,本專案以最簡單的方式封裝了訊息推送功能在nodejs端的實現。

KOA2-PWA

KOA2-PWA 是pwa推送伺服器的簡單實現,使用 koa2 開發,使用 mysql 資料庫儲存,使用 pm2 管理程式和日誌。

檢視 PWA前端專案實現

執行過程

pwa 訊息推送功能依賴於Service Worker(簡稱sw),使用 VAPID 協議

notification
notification

-> server端使用 web-push 生成vapidKeys(publicKey,privateKey)
-> server端儲存publicKey,privateKey,前端儲存publicKey
-> 前端sw使用加密後的publicKey去訂閱並獲得訂閱物件,然後儲存到server端
-> server端在需要推送時獲取訂閱物件即可推送

專案目錄中,app.js是啟動檔案,/bin/www是啟動檔案的封裝,一般使用www啟動服務;
/public是web靜態檔案,/views是網頁模板;
重點來看/db和/routes,顯然/db是跟資料庫相關,/routes是跟路由相關。

// /db/config.js 儲存資料庫登入資訊
const config = {
  host: ***,
  user: ***,
  password: ***,
  database: '***', // 資料庫名稱,自定義
  port: ***
}
module.exports = config

// /db/index.js 資料庫相關操作
const mysql = require('mysql')
const config = require('./config')

const pool = mysql.createPool(config)

// some sql

module.exports = {
  // some methods
}
複製程式碼

/routes/notification.js:
更多推送訊息配置項 Notification options

const router = require('koa-router')()
const webpush = require('web-push')
const dbModel = require('../db/index')

// VAPID keys should only be generated only once.
// const vapidKeys = webpush.generateVAPIDKeys()
const publicKey = '***'
const privateKey = '***'
const gcmapiKey = 'PWA_LITE_GCMAPIKey' // 自定義,儲存在前端manifest.json
const mailto = 'mailto:yourname@mail.com'

// send notification to client
const sendNotification = (pushSubscription, body) => {
  return webpush.sendNotification(pushSubscription, JSON.stringify(body))
}

webpush.setGCMAPIKey(gcmapiKey)
webpush.setVapidDetails(mailto, publicKey, privateKey)

// router prefix
router.prefix('/api/notification')

// user subscribe
router.post('/subscribe', async (ctx, next) => {
  let body = ctx.request.body
  let user = [body.authSecret, body.key, body.endpoint]
  let pushSubscription = {
    endpoint: body.endpoint,
    keys: {
      auth: body.authSecret,
      p256dh: body.key
    }
  }
  let body = {
    title: 'Congratulations',
    message: `Hello,Thank you for subscribtion!`,
    data: {}
  }
  sendNotification(pushSubscription, body)
  // do something
})

module.exports = router
複製程式碼

開始

github

koa2需要nodejs 7.6以上版本。

# install pm2
npm install -g pm2

# install dependencies
npm install

# serve with hot reload at localhost:3000
npm start

# run with pm2
npm run prd
# or pm2 start bin/www
複製程式碼

相關文章