You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

从Service Worker向React组件传数据时提示Event未定义如何解决?

问题解决方法

错误原因分析

  1. event未定义:activate事件监听的回调函数没有接收event参数,导致后续调用event.waitUntil()时抛出引用错误。
  2. subscription作用域问题:subscription变量在try代码块内部声明,外部的postMessage无法访问该变量,会引发新的未定义错误。

修正后的Service Worker代码

self.addEventListener('activate', async (event) => { // 添加event参数
    let subscription;
    try {
        const applicationServerKey = urlB64ToUint8Array('***');
        const options = { 
            applicationServerKey,
            userVisibleOnly: true 
        };
        subscription = await self.registration.pushManager.subscribe(options);
    } catch (err) {
        console.log('Error', err);
        return; // 订阅失败时直接返回,避免后续无效执行
    }

    event.waitUntil(
        self.clients.matchAll({ type: "window" }).then(clientsArr => {
            if(clientsArr[0]) {
                clientsArr[0].focus();
                clientsArr[0].postMessage({
                    msg: subscription
                });
            }
        })
    );
});

额外优化建议

  • 确保urlB64ToUint8Array函数已正确定义,否则会引发新的执行错误。
  • React组件中可优化消息监听逻辑,避免内存泄漏:
useEffect(() => {
    if("serviceWorker" in navigator) {
        const handleMessage = (message) => {
            console.log('serviceworker returns', message.data);
            // 在这里处理接收到的subscription数据
        };
        navigator.serviceWorker.addEventListener("message", handleMessage);
        // 组件卸载时移除监听
        return () => {
            navigator.serviceWorker.removeEventListener("message", handleMessage);
        };
    }
},[]);

内容的提问来源于stack exchange,提问作者Emm

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.24 04:15:57