Node.js Serviceworker订阅在firefox中工作,但在Chrome中不工作。抛出错误:";注册失败-没有服务人员“&引用;
我正在尝试设置一个服务工作者,以便从nodejs后端接收推送通知到react。以下代码在Firefox中运行,但Chrome抛出错误“注册失败-没有服务人员”。serviceworker本身似乎正在工作,但在pushManager上包含订阅调用会引发错误。是否有人知道问题出在哪里,或者您需要更多信息Node.js Serviceworker订阅在firefox中工作,但在Chrome中不工作。抛出错误:";注册失败-没有服务人员“&引用;,node.js,reactjs,service-worker,Node.js,Reactjs,Service Worker,我正在尝试设置一个服务工作者,以便从nodejs后端接收推送通知到react。以下代码在Firefox中运行,但Chrome抛出错误“注册失败-没有服务人员”。serviceworker本身似乎正在工作,但在pushManager上包含订阅调用会引发错误。是否有人知道问题出在哪里,或者您需要更多信息 const checkSupport = () => { if (!('serviceWorker' in navigator) || !('PushManager' in window)
const checkSupport = () => {
if (!('serviceWorker' in navigator) || !('PushManager' in window)) {
return false;
}
return true;
};
const registerServiceWorker = async () => {
const registration = await navigator.serviceWorker.register('/service.js', { scope: '/' });
await navigator.serviceWorker.ready; // Waits for the serviceworker to be ready
return registration;
};
const requestNotificationPermission = async () => {
const permission = await Notification.requestPermission();
if (permission !== 'granted') {
return false;
}
return true;
};
// urlB64ToUint8Array is a magic function that will encode the base64 public key
// to Array buffer which is needed by the subscription option
const urlBase64ToUint8Array = (base64String: string) => {
const padding = '='.repeat((4 - (base64String.length % 4)) % 4);
const base64 = (base64String + padding).replace(/-/g, '+').replace(/_/g, '/');
const rawData = atob(base64);
const outputArray = new Uint8Array(rawData.length);
for (let i = 0; i < rawData.length; ++i) {
outputArray[i] = rawData.charCodeAt(i);
}
return outputArray;
};
const installServiceWorker = async (team: number, semester: number) => {
try {
// Check browser compatability and notification permission
if (!checkSupport() || !(await requestNotificationPermission())) return;
// Register serviceworker
const registration = await registerServiceWorker();
registration.showNotification('Hello notification!');
// Subscribe the user to notifications
const publicVAPID =
'<String>';
const applicationServerKey = urlBase64ToUint8Array(publicVAPID);
const subscription = await registration.pushManager.subscribe({
userVisibleOnly: true,
applicationServerKey
});
} catch (error) {
console.error(new Error(error));
}
};
export default installServiceWorker;
这就是错误所在
谢谢。所以我发现serviceworker不工作的原因是create react应用程序(我用它引导我的应用程序)包含它自己的serviceworker。当我删除对它的调用时,我自己的自定义serviceworker开始工作
console.log('Hello from serviceworker');
self.addEventListener('activate', async () => {
console.log('activated');
});
self.addEventListener('push', (event) => {
const data = event.data.json();
self.registration.showNotification(data.title, {
body: 'Yay it works!'
});
});