在 Firestore 触发的云函数中,没有更改的之前/之后属性不相等



我有一个名为events的 firestore 集合,其中包含字段为beginendtitle的文档。 如果文档已更改,则会触发该函数。

beginend属于timestamp型。 我希望我的函数return false是否更改了beginend

在我的云函数中,我检查前后数据是否相等,但是返回true,即使只更改了字段title

const before = change.before.data()
const after = change.after.data()
//begin and end weren't changed. Still, true is returned
if (before?.begin == after?.begin && before?.end == after?.end) {
return false
}
return true

比较毫秒时,它有效:

const before = change.before.data()
const after = change.after.data()
//begin and end weren't changed. false is returned    
if (before?.begin.toMillis() == after?.begin.toMillis() && before?.end.toMillis() == after?.end.toMillis()) {
return false
}

这是什么原因造成的?我不应该能够比较Timestamp对象本身,而不是使用成员函数比较它吗?

我不应该能够比较时间戳对象本身而不是使用成员函数比较它吗?

不,JavaScript 中的==运算符在应用于对象时,仅比较对两个对象的引用。 它没有对它们进行深入比较。 因此,仅当两个对象是完全相同的对象时,它才会生成 true。

如果要比较两个时间戳对象,则需要深入比较它们。 正如您从链接的 API 文档中看到的那样,时间戳上提供了一个 isEqual 方法,可以为您执行此操作。

before?.begin.isEqual(after?.begin)

当你使用toMillis时,你所做的是比较两个JavaScript数字对象,它们通过它们的实际值更直观地进行比较。 在这种情况下,它也不是精确的比较,因为时间戳可以表示纳秒精度时间。 转换为毫秒会丢失数据。

相关内容

  • 没有找到相关文章

最新更新