firebase.firestore.FieldValue.serverTimestamp() 不再起作用
我有一段时间没有处理我的项目了,因此在将 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))
>
因此,我获得了有关其行为方式的更多信息。
如果我尝试使用此代码创建时间戳类型对象, 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”,这显然不是我想要的。
我在 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,并尝试重新安装它们,可能使用我见过的一些新实现。
如果这不起作用,我认为可能需要进行全面重构并从头开始构建。
如果我是你,我会使用本机 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]
好的,所以问题完全在于我如何通过 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 也更新了,我之前的所有功能都会按预期运行。
希望如果其他人遇到类似的问题,他们会发现这很有用。感谢所有帮助我缩小问题范围的人!