首页 > 解决方案 > Firebase 函数与 Set() 上的 Converter Wipes 文档参考

问题描述

我有一个预定函数,可以将我的 Firestore 中的整数值重置为零。我遇到的问题是,虽然合并集成功(对于指定的属性),但它以某种方式将我的Organization文档引用重置为 null。

到目前为止,我已经尝试了以下

  user.reference?.withConverter(userConverter).set(user)

这也是可行的,但它会覆盖整个用户对象,并且可能会导致并发问题,以防用户在定时函数运行时也更新他的对象。

我正在寻找一种解决方案,允许我将转换器类与合并一起使用Set()

User界面看起来像这样

export interface User extends Document {
  email?: string
  name?: string
  organization?: Organization | null
  numberOfForwards?: number
  lastForwardReset?: moment.Moment
}

像这样的转换器

export class UserConverter implements firestore.FirestoreDataConverter<User> {
  toFirestore(user: User): firestore.DocumentData {
    return {
      email: user.email,
      name: user.name,
      organization: user.organization ? user.organization.reference : null,
      number_of_forwards: user.numberOfForwards,
      last_forward_reset: user.lastForwardReset?.toDate()
    }
  }
  fromFirestore(snapshot: firestore.QueryDocumentSnapshot): User {
    const data = snapshot.data()!

    return {
      reference: snapshot.ref,
      email: data.email,
      name: data.name,
      organization: data.organization ? { reference: data.organization } : null,
      numberOfForwards: data.number_of_forwards,
      lastForwardReset: moment(data.last_forward_reset.toDate())
    }
  }
}
export const resetNumberOfForwards = functions.pubsub
  .schedule('every 15 minutes')
  .onRun(async () => {
const reset = (user: User) => {
  console.log(`Resetting ${user.email} from [${user.numberOfForwards}] to [0]`)
  // Claim user reference
  user.reference
    ?.withConverter(userConverter)
    .set({ numberOfForwards: 0, lastForwardReset: Moment() }, { merge: true })
}

为了使部分设置正常工作,我在文件顶部包含了以下代码段

firebase.firestore().settings({
  ignoreUndefinedProperties: true
})

标签: javascriptfirebasegoogle-cloud-firestoregoogle-cloud-functions

解决方案


推荐阅读