【问题标题】:Firestore onSnapshot returning wrong timestamp formatFirestore onSnapshot 返回错误的时间戳格式
【发布时间】:2018-12-25 21:44:03
【问题描述】:

当我使用 .get() 获取 FireStore 文档时,我的时间字段返回此值:createdAt: "2018-12-25T01:04:05.189Z" 但当我使用 onSnapshot 时,时间字段返回不同的值:

1) 使用onSnapshot

  componentDidMount() {
    this.unsubscribe = this.ref.doc('HCNFO3ZKlFNKK71JMzo8').onSnapshot(this.onCollectionUpdate)
  }

  componentWillUnmount() {
    this.unsubscribe();
  }

  onCollectionUpdate = (querySnapshot) => {
    this.setState({
      theLocation: querySnapshot.data()
    })
  }

返回:mylocations: { createdAt: Timestamp {seconds: 1545723905, nanoseconds: 177000000} }

2)在云函数上使用.get()

.then(() => {
  return firebaseAdminSDK.firestore().collection('locations').doc('HCNFO3ZKlFNKK71JMzo8').get()
})

返回:mylocations: { createdAt: "2018-12-25T07:45:05.177Z" }

保存位置时,我在云功能上使用了data.createdAt = FieldValue.serverTimestamp();

知道发生了什么吗?

【问题讨论】:

  • 请编辑问题以显示两种情况下的代码。
  • @DougStevenson 谢谢,我添加了更多细节
  • 我认为您的意思是云功能中的 admin sdk 和客户端应用程序中的 javascript sdk 之间的区别,而不是 getonSanpshot 之间的区别。我认为在您的客户端应用程序中使用 get 与 onSanpshout 的时间戳结果相同。
  • 我没有看到您实际打印或尝试处理值的代码。请不要截图 - 它们没有帮助。将文本直接复制到问题中。
  • 虽然这些值是相同的,只是表示形式不同。这里真的有问题吗? 1545723905 以秒为单位,因为 Epoch 是 December 25, 2018 7:45:05,这是另一个方法返回的值,所以它们都给出相同的值

标签: firebase google-cloud-firestore


【解决方案1】:

javascript 客户端库中的新 Timestamp 对象(具有秒和纳秒)将成为默认时间戳,它将替换 firebase 时间戳中的旧 javascript Date 对象。您应该采用新的行为并更新您的代码以使用新的时间戳对象。

要从时间戳中获取 Date 对象,请使用toDate() 方法:

const timestamp = snapshot.get('createdAt');
const date = timestamp.toDate();

您可以将新的时间戳行为设为您的应用和云函数中的默认行为,并更新您的代码,以便在删除 Date 对象时您的应用不会中断。要使用新的时间戳,您可以将 timestampsInSnapshots: true 添加到 Firestore 设置:

// javascript sdk
firebase.firestore().settings({
   /* other settings */
   timestampsInSnapshots: true
})

// admin sdk
admin.firestore().settings({
   /* other settings */
   timestampsInSnapshots: true
})

【讨论】:

【解决方案2】:

最终在云功能上使用 moment.utc()

const createdAt = FieldValue.serverTimestamp()替换为const createdAt = moment.utc().valueOf()

之后,createdAt 字段在云函数和前端提取上返回相同的值,因为它在 firestore 中将时间戳存储为 number 而不是 timestamp

【讨论】:

  • 您已将数据库中创建数据的时间戳替换为调用函数时的时间戳。有一个微妙的区别,它有不同的含义。特别是如果你在前端做同样的事情。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-10-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-09-20
  • 2021-05-09
  • 1970-01-01
相关资源
最近更新 更多