【发布时间】:2021-12-13 02:29:11
【问题描述】:
我有两个云函数,当用户使用我的前端 Web 应用进行身份验证时,它会在用户对象上设置一个标志,这会触发第一个云函数执行:
exports.observeUserUpdate = functions.firestore
.document("/data/{uid}")
.onUpdate(async (snapshot) => {
const user = snapshot.after.data() as User;
if (user.scanRepositories) {
await pubSubClient
.topic("user-repositories-update")
.publish(Buffer.from(JSON.stringify(user)));
}
});
这个函数会将一个主题发送到一个队列,我有一个订阅者将接收该消息并执行一些后端操作,修改用户下的嵌套文档。
我有第二个云函数,它正在侦听用户文档下的更改,但只对我感兴趣的更改进行操作:
exports.observeRepositoryUpdate = functions.firestore
.document("/data/{uid}/repositories/{repositoryId}")
.onUpdate(async (snapshot) => {
const repository = snapshot.after.data() as Repository;
if (repository.task == null || repository.task.length == 0) {
return;
}
if (repository.task.some((task: Task) => task.run)) {
await pubSubClient
.topic("repository-update")
.publish(Buffer.from(JSON.stringify(repository)));
}
});
当文档发生变化并满足特定条件时,它将触发另一个主题以供不同的后端系统处理。
这一切都非常简单且有道理,出现问题的地方是用户正在退出,当他们重新登录时,并且设置了一个标志,正确地第一个函数触发并且后端执行它应该做的事情,但是,作为第二个函数的一部分发送的所有消息都被“重播”给该主题的使用者。
例如,用户登录并为repositories 创建tasks。这些任务已正确执行,并且一切正常。用户然后注销,然后重新登录,这些相同的任务在不应该被第二个函数再次触发。
看起来第二个函数正在触发整个变更集/历史记录。
是我的数据结构错误,还是我的文档路径不正确?希望得到一些帮助和道歉,这太罗嗦了。
编辑:为了帮助说明这里发生的事情的服务器日志中的顺序
// User logs in, login task fires as expected
2021-10-28 12:12:27.489 INFO 60338 --- [pool-1-thread-2] s.f.g.listeners.consumer.UserConsumer : User consumer triggered: User(uid=g1OQ0K1...)
2021-10-28 12:12:27.492 INFO 60338 --- [pool-1-thread-2] s.f.github.services.GitHubServiceImpl : Finding repositories
2021-10-28 12:12:31.954 INFO 60338 --- [pool-1-thread-2] s.f.g.r.FirestoreRepositoryImpl : Batch write for 131 repositories
2021-10-28 12:13:05.827 INFO 60338 --- [pool-1-thread-2] s.f.g.r.FirestoreRepositoryImpl : Batch write for 9 languages
2021-10-28 12:13:05.829 INFO 60338 --- [pool-1-thread-2] s.f.g.r.FirestoreRepositoryImpl : Batch write for 5 types
// Login task complete
// User runs task on repository
2021-10-28 12:13:50.392 INFO 60338 --- [pool-1-thread-2] s.f.g.l.consumer.RepositoryConsumer : Repository consumer triggered: RepositoryDto(id=39931...)
2021-10-28 12:13:51.237 INFO 60338 --- [pool-1-thread-2] s.f.g.s.PackageManagerServiceImpl : Detecting package manage for google-photo-frame with language Java
2021-10-28 12:13:52.319 INFO 60338 --- [pool-1-thread-2] s.f.g.r.FirestoreRepositoryImpl : Batch write for 1 package managers
// Task completes
// User logs out and back in, the RepositoryConsumer is triggered again when it shouldnt
2021-10-28 12:15:09.917 INFO 60338 --- [pool-1-thread-5] s.f.g.l.consumer.RepositoryConsumer : Repository consumer triggered: RepositoryDto(id=39931...)
2021-10-28 12:15:10.807 INFO 60338 --- [pool-1-thread-5] s.f.g.s.PackageManagerServiceImpl : Detecting package manage for google-photo-frame with language Java
2021-10-28 12:15:11.872 INFO 60338 --- [pool-1-thread-5] s.f.g.r.FirestoreRepositoryImpl : Batch write for 1 repositories
2021-10-28 12:15:12.262 INFO 60338 --- [pool-1-thread-5] s.f.g.listeners.consumer.UserConsumer : User consumer triggered: User(uid=g1OQ0K1...)
2021-10-28 12:15:12.262 INFO 60338 --- [pool-1-thread-5] s.f.github.services.GitHubServiceImpl : Finding repositories
2021-10-28 12:12:31.954 INFO 60338 --- [pool-1-thread-2] s.f.g.r.FirestoreRepositoryImpl : Batch write for 131 repositories
2021-10-28 12:13:05.827 INFO 60338 --- [pool-1-thread-2] s.f.g.r.FirestoreRepositoryImpl : Batch write for 9 languages
2021-10-28 12:13:05.829 INFO 60338 --- [pool-1-thread-2] s.f.g.r.FirestoreRepositoryImpl : Batch write for 5 types
【问题讨论】:
标签: node.js google-cloud-firestore google-cloud-functions