开发者问题收集

firebase.firestore.FieldValue.serverTimestamp() 不再起作用

2024-01-30
243

我有一段时间没有处理我的项目了,因此在将 firestore 更新到最新版本后,我遇到了我一直在使用的服务器时间戳问题。

import { AngularFirestore } from '@angular/fire/compat/firestore';
import firebase from 'firebase/compat/app';
import 'firebase/firestore'

const timestamp = { timestamp: firebase.firestore.FieldValue.serverTimestamp() }

这已经工作了一段时间,并且会将 firestore 中的字段保存为时间戳类型(参见下面的屏幕截图)

当我尝试在更新后运行它时,我收到以下控制台错误:

ERROR TypeError: Cannot read properties of undefined (reading 'FieldValue')

我试图将导入更新为

import { serverTimestamp } from 'firebase/firestore';

然后使用类似这样的方法尝试设置时间戳字段

const timestampA = {timestamp: serverTimestamp()}

我在尝试实际保存它时遇到错误:

ERROR FirebaseError: Function addDoc() called with invalid data. Unsupported field value: a custom aj object (found in field timestamp in document Party-Management/8UcAzhIEPAwFqUTkwr71/Party-Inventory/uthoJHWfozdjZ5OyluBW)

我是否遗漏了有关如何让 serverTimestamps 在较新的 firebase 中工作的某些信息版本?

以下是以前版本中运行的整个函数:

addInventory(inventoryAdd: any, pid: string, sid?: string, eid?: any) {
const inventoryCollectionRef = this.afs.collection(this.partyCollectionPath + pid + this.partyInventoryPath);
const timestamp = { timestamp: firebase.firestore.FieldValue.serverTimestamp() }
const sessionId = sid ? { sessionId: sid} : null;
const eventId = eid ? { eventId: eid } : null;
return inventoryCollectionRef.add({ ...inventoryAdd, ...timestamp, ...sessionId, ...eventId }).then(docRef => {
  return docRef.id
}).catch(error => console.error("Error adding document: ", error))

>

firestore

因此,我获得了有关其行为方式的更多信息。

如果我尝试使用此代码创建时间戳类型对象, const timestamp = { timestamp: serverTimestamp() } 此代码会崩溃:

inventoryCollectionRef.add({ ...inventoryAdd, ...timestamp, ...sessionId, ...eventId })

出现此错误消息:

ERROR FirebaseError: Function addDoc() called with invalid data. Unsupported field value: a custom aj object (found in field timestamp in document Party-Management/8UcAzhIEPAwFqUTkwr71/Party-Inventory/NCi4Ad4a2jc8RjdKQdNm)

这意味着 serverTimestamp() 中现在的任何内容都无法与'timestamp' 类型是我过去曾使用过的。

如果我仅将常量更改为此:

const timestamp = serverTimestamp()

该调用实际上会执行并将记录保存到 firestore,但当我实际查看 firestore 中的数据时,它会保存一个字符串类型,其字段名称为“_methodname”,值为“serverTimestamp”,这显然不是我想要的。

firestore types

我在 Firebase 中的 Timestamp 类上找到了一些文档,因此我也会尝试查看它。 ( https://firebase.google.com/docs/reference/js/firestore_.timestamp

最后,我希望能够专门保存“时间戳”类型,我相信有办法做到这一点!

**更新:**呃,我猜这与我以前对 angularFirestore 和 firebase 的实现有关,可能与一些“黑客”升级有关,我并不真正明白自己在做什么。我发现当前的文档暗示这仍然是正确的方法( https://firebase.google.com/docs/firestore/manage-data/add-data#server_timestamp ),所以我猜我在某个地方遇到了一些有趣的不匹配。

除非有人有“灵丹妙药”式的修复方法,否则我的接下来两个步骤是尝试弄清楚如何通过 ng 和 npm 完全删除当前版本的 angulare/firestore 和 firebase,并尝试重新安装它们,可能使用我见过的一些新实现。

如果这不起作用,我认为可能需要进行全面重构并从头开始构建。

2个回答

如果我是你,我会使用本机 firebase 库 - 你不需要导入

删除

import { AngularFirestore } from '@angular/fire/compat/firestore';

你已经导入了库,这会产生冲突。 那么你需要导入它们。

{ serverTimestamp,} from @firebase/firestore**

其次,没有理由将对象包装在字段周围,这会产生问题。 你现在应该只使用 serverTimestamp()

"Returns a sentinel used with @firebase/firestore/lite#(setDoc:1) or @firebase/firestore/lite#(updateDoc:1) to include a server-generated timestamp in the written data."

这不喜欢数据呈现给它的方式。就其价值而言,我通常只使用 DayJS 来处理时间和日期问题。 也就是说试试这个。它期望以 JSON 形式表示时间和日期,但您没有提供它所期望的内容。

const timestamp = JSON.stringify(serverTimestamp())

如果您有 LinkedIn,我写了一篇关于如何正确设置 Firebase 的博客

[如何设置 Firebase][1]

2024-01-30

好的,所以问题完全在于我如何通过 NG 和 NPM 升级我的 angular fire 和 firebase。升级之前,我使用的是 angular v16 和以下版本的 angular/fire 和 firebase:

@angular/[email protected]
[email protected]

我首先使用 ng update 命令将除 @angulare/fire 之外的所有内容升级到最新版本:

@angular/cdk                       16.0.4 -> 17.1.1         ng update @angular/cdk
  @angular/cli                       16.0.5 -> 17.1.1         ng update @angular/cli
  @angular/core                      16.0.5 -> 17.1.1         ng update @angular/core
  @angular/fire                      7.6.1 -> 17.0.1          ng update @angular/fire
  @angular/material                  16.0.4 -> 17.1.1         ng update @angular/material

如果您尝试在 angulare/fire 上直接从 7x 升级到最新的 17,NPM 不喜欢巨大的版本跳跃,并会向您显示错误消息。因此,为了升级 angulare/fire,我进入 package.json 并直接将版本号从“7.6.1”编辑为“17.0.1”。然后我运行了“npm install”,它获取了 package.json 中更改的版本号并按预期安装了当前的 @angular/fire 版本。

这样做最终给了我与之前完全相同的 FieldValue 错误,所以我还必须使用 package.json 技巧将 firebase 从 9.22.2 升级到最新的 10.7.2。一旦 firebase 也更新了,我之前的所有功能都会按预期运行。

希望如果其他人遇到类似的问题,他们会发现这很有用。感谢所有帮助我缩小问题范围的人!

Rusty Shackleford
2024-01-31