繁体   English   中英

从NodeJS服务器向Web客户端发送消息

[英]Sending messages from NodeJS server to Web client

我正在尝试将邮件从服务器发送到客户端,但无法完全正常工作(从不调用onMessage处理程序)。

每当我运行服务器代码时,在chrome://gcm-internals/标签中,我都可以看到传入的消息。这意味着服务器与浏览器之间的连接正常。 问题必须在客户端代码中。

在此处输入图片说明

一般流程如下:

  • 客户端代码(伪代码)连接到firebase ,获取token ,订阅onMessage事件。

  • 服务器代码(伪代码)连接到firebase使用客户端的令牌向客户端发送payload

客户代码:

import firebase from 'firebase/app'
require('firebase/messaging')
import { serviceWorkerRegistration } from './worker.service'

const config = {
  apiKey: <...>,
  authDomain: <...>,
  databaseURL: <...>,
  projectId: <...>,
  storageBucket: <...>,
  messagingSenderId: <...>
}

const app = firebase.initializeApp(config)
const messaging = firebase.messaging()

messaging.useServiceWorker(serviceWorkerRegistration)

messaging.getToken()
  .then(token => console.log(token)
  .catch(error => console.log(error))

messaging.onMessage(function (payload) {
  console.log('Message received:', payload)
})

服务器代码:

const admin = require('firebase-admin')
const config = require('./config')
const signature = require('./signature.json')

admin.initializeApp({
  credential: admin.credential.cert(signature),
  databaseURL: config.databaseURL
})

const messaging = admin.messaging()

const token = <...>

const payload = {
  data: {
    text: "Hello from server"
  }
}

admin.messaging().sendToDevice(token, payload)
  .then(function(response) {
    console.log('response:',response)
    console.log('response.results:',response.results)
  })
  .catch(function(error) {
    console.log("Error sending message:", error)
  })

据我从文档中了解到,此设置可以在app处于foreground时处理传入消息,但由于某些原因它无法正常工作。 我想念什么?

显然,要使通知和消息正常工作,有必要在service worker文件中启动messaging

service-worker.js(代码段)

importScripts('https://www.gstatic.com/firebasejs/3.9.0/firebase-app.js')
importScripts('https://www.gstatic.com/firebasejs/3.9.0/firebase-messaging.js')
firebase.initializeApp({ messagingSenderId: <...> })
const messaging = firebase.messaging()

messaging.setBackgroundMessageHandler(function (payload) {
  console.log(payload)
  const title = payload.data.title
  const options = {
    body: payload.data.title,
    icon: '/notification-icon-192.png'
  }
  return self.registration.showNotification(title, options)
})

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM