我有一个基于React Redux和Firebase实时数据库构建的应用程序,用于存储。
我已经按照the Mozilla developer documentation中的说明设置了服务工作者订阅。
在90%的情况下,一切正常,但有时由于某些原因未执行数据库写入sendSubscriptionToServer(subscription);
。
结果是客户端具有有效且活动的订阅,但该应用没有该订阅的重新排序。
我要做的是检查连接的客户端订阅是否存储在数据库中,如果没有,则将其推送到数据库中。
有推荐的方法吗?
我现在要做的是将用户服务工作者的订阅存储在Redux存储中,并对照那些内容进行检查,以查看是否缺少缺少的订阅。
// sense if browser/user combo has a subscription
export const hasSwSubscription = async ({uid, serviceWorkerSubscrObj}) => {
// uid : firebase user database id
// serviceWorkerSubscrObj : Users subscriptions from Redux store
let result = false
// Exit if no service worker
if (!('serviceWorker' in navigator)) {
console.log('No service worker')
return result
}
try{
const serviceWorkerReg = await navigator.serviceWorker.ready.then((swreg) => swreg)
const subscription = await serviceWorkerReg.pushManager.getSubscription()
if (subscription !== null) {
result = true
// Check if subscription is in database
const mySwSub = subscription.toJSON()
let isSwSubInDatabase = false
Object.keys(serviceWorkerSubscrObj).forEach( (serviceWorkerSubscr) => {
const endpoint = (serviceWorkerSubscr.endpoint) ? serviceWorkerSubscr.endpoint : ''
if(!isSwSubInDatabase){
isSwSubInDatabase = (mySwSub.endpoint === endpoint)
}
})
// Insert in database if missing
const hasUid = (uid) ? true : false
if(hasUid){
const dbPath = `/serviceWorkerSubscriptions/${uid}`
console.log('Mend Subscription', mySwSub)
const newRef = database.ref(dbPath).push()
const key = newRef.key
database.ref(`${dbPath}/${key}`).set(mySwSub)
.then((res) => {
// Pushed to database --> Redux store will be updated
})
.catch((err) => {
console.error('Mend push error', err)
})
}
}
}catch(err){
console.log(err)
}
return result
}
由于商店通过firebase.on()
订阅更新,因此这种方法可能会产生永恒的循环。
是否有更好的和/或推荐的方法来处理此问题?
非常感谢/ K