javascript - Firebase 函数与 Set() 上的 Converter Wipes 文档参考
问题描述
我有一个预定函数,可以将我的 Firestore 中的整数值重置为零。我遇到的问题是,虽然合并集成功(对于指定的属性),但它以某种方式将我的Organization
文档引用重置为 null。
到目前为止,我已经尝试了以下
- 不使用转换器和
Update()
函数(而不是Set()
)。虽然这可行,但它是无类型的,我必须摆脱封装 moment() 到 Date 转换的转换器。 - 使用
Set()
并简单地传递整个对象。
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
})
解决方案
推荐阅读
- python - 如何使用 FLASK 向 API 添加消息对象
- visual-studio-code - VS Code,保存文件时如何强制保存另一个文件?
- javascript - 在反应中使用 Firebase 和上下文 API 进行身份验证给我一个警告。这是正确的方法吗?
- google-calendar-api - 插入日历事件时缺少结束时间
- python - Ride IDE 在使用库关键字时使用 Robot Framework 崩溃并出现“致命的 Python 错误:无法从堆栈溢出中恢复”。在终端上
- forms - 如何创建多个动态表单并分别存储它们的值以在 react native 中提交
- ios - 带有列表编程导航的 SwiftUI NavigationView 不起作用
- python-3.x - 如何从字典列表中取出 thigs
- python - python中的Git合并基础和合并树
- python-3.x - Python输入循环不接受所有输入