Javascript 如何将数据(如用户ID)传递给web工作者,以便从服务器获取额外的推送通知数据?

Javascript 如何将数据(如用户ID)传递给web工作者,以便从服务器获取额外的推送通知数据?,javascript,html,push-notification,google-chrome-app,web-worker,Javascript,Html,Push Notification,Google Chrome App,Web Worker,我想我错过了一些非常容易的事情 我正在注册一名服务人员,以便通过GCM从我的服务器接收推送通知。这个很好用 不幸的是,我不能随推送通知一起传递任何数据,因此,当服务人员收到推送时,它对推送一无所知。因此,在显示通知之前,我会回拨服务器请求有关推送的其他信息,如标题、消息和图标 我的问题是,在显示推送之前,当我回叫服务器获取附加信息时,我在服务人员中没有任何关于请求附加信息的用户的信息。为了收集这些信息,我需要向服务器传递一个用户ID和令牌 因此,我的问题归结为:如何将用户id和令牌变量从我的co

我想我错过了一些非常容易的事情

我正在注册一名服务人员,以便通过GCM从我的服务器接收推送通知。这个很好用

不幸的是,我不能随推送通知一起传递任何数据,因此,当服务人员收到推送时,它对推送一无所知。因此,在显示通知之前,我会回拨服务器请求有关推送的其他信息,如标题、消息和图标

我的问题是,在显示推送之前,当我回叫服务器获取附加信息时,我在服务人员中没有任何关于请求附加信息的用户的信息。为了收集这些信息,我需要向服务器传递一个用户ID和令牌

因此,我的问题归结为:如何将用户id和令牌变量从我的core.js代码中提取到服务工作者中,以便我可以使用它们从我的服务器收集其他信息?

在我的web应用程序中,我像这样注册服务人员:

core.js
var uid=“89123891231239”//伪全局id变量
var token=“eo4Dr8qhrFY”//伪全局令牌变量
函数setupPushNotifications(){
log(“设置推送通知”);
if(导航器中的“serviceWorker”){
register('js/pushWorker.js')。然后(函数(reg){
控制台日志(reg);
注册pushManager.subscribe({
userVisibleOnly:true
}).然后(功能(子){
log('endpoint:',sub.endpoint);
});
}).catch(函数(错误){
console.log('Error:',Error);
});
}
}
然后,我有一个服务人员,看起来像这样:

pushWorker.js
我在这里读到了关于工人限制的内容:

我知道postMessage的
功能,但我不知道如何在实践中理解它


任何帮助都将不胜感激。

您可以像这样轻松地解决您的问题:

if ('serviceWorker' in navigator) {
    navigator.serviceWorker.register('pushWorker.js').then(function() {
        return navigator.serviceWorker.ready;
    }).then(function(reg) {
        console.log('Service Worker is ready', reg);
        reg.pushManager.subscribe({userVisibleOnly: true}).then(function(sub) {

            console.log('endpoint:', sub.endpoint);
            reg.active.postMessage(JSON.stringify({uid: uid, token: token}));
            console.log("Posted message");

        });
    }).catch(function(error) {
        console.log('Error : ', error);
    });
}
这里的关键是

reg.active.postMessage(JSON.stringify({uid: uid, token: token}));
…因为在代码中的这一点上,您可以访问postMessage()

在工作代码中,请确保具有以下内容:

self.addEventListener('message', function(event){
    var data = JSON.parse(event.data);

    console.log("SW Received Message:");
    console.log(data);

    self.userID = data.uid;
    self.userToken = data.token;

});

当您最终需要调用服务器并请求其他推送信息时,这将使您能够全局访问您的用户ID和用户令牌信息

我在您发布的core.js代码中没有看到令牌和用户id,我将编辑我的帖子-我假设这些变量确实存在,尽管没有列出。我不需要精确的代码来显示如何传递这两个变量,我在寻找关于数据传递如何工作的帮助,一般来说,当我收到推送时。你应该使用postMessage向worker发送消息。如果它们不在全局范围内,你必须以某种方式传递它们,这就是这个问题的意义所在,对吧?请看我的问题。我真的写了“我知道postMessage()函数,但我不知道如何在实践中理解它。”太棒了!非常感谢-经过测试,工作正常。不确定工作生命周期:如果浏览器重新启动(但网页未被访问),网络工作也会重新启动吗?如果是这样,userId和userToken变量会丢失吗?我在使用时收到错误:
注册失败-缺少applicationServerKey,并且清单为空或缺少
。最后,通过直接使用postMessage实现了同样的功能:
applicationServerKey
错误意味着您需要传递乏味的公钥。
self.addEventListener('message', function(event){
    var data = JSON.parse(event.data);

    console.log("SW Received Message:");
    console.log(data);

    self.userID = data.uid;
    self.userToken = data.token;

});