问题描述
我陷入了这个似乎不想解决的难题中,我有点确定我忘记了一些东西,因为我刚开始学习 react-native。
async componentDidMount() {
let user = await UserRepository.getUserRef(firebase.auth().currentUser.uid);
await firebase
.firestore()
.collection("reminder")
.where("user","==",user)
.get()
.then((remindersRecord) => {
remindersRecord.forEach((reminderDoc) => {
console.log(reminderDoc.data());
});
});
我正在尝试获取连接用户的“提醒”数据,查询有效,因为我们得到了包含一堆对象的提醒文档,里面有我想要的数据,但是当我调用 data() 时,没有任何变化,我没有得到它返回相同对象的文档。
非常感谢任何帮助!
解决方法
我试图在我这边复制这个,我认为这很好用。我认为您得到的结果与字段 boss
和 user
相关,我猜它们是 firestore 中的 reference
类型。如果您登录控制台,这些字段会给出如下结果:
{
reference: DocumentReference {
_firestore: Firestore {
_settings: [Object],_settingsFrozen: true,_serializer: [Serializer],_projectId: <PROJECT_ID>,registeredListenersCount: 0,bulkWritersCount: 0,_backoffSettings: [Object],_clientPool: [ClientPool]
},_path: ResourcePath { segments: [Array] },_converter: {
toFirestore: [Function: toFirestore],fromFirestore: [Function: fromFirestore]
}
},text_field: 'test',...
}
因此,对于呈现的示例,您将获得 2 个这样的字段,对于这些字段,您不会将其视为字符串。顺便说一句,时间戳字段也不会正确显示。
为避免此问题,您可以使用文档引用的示例 path
property,或者当涉及到时间戳时,您可以使用 toDate()
method。我创建了一个小例子来正确显示字段(循环所有对象字段):
remindersRecord.forEach((reminderDoc) => {
for (const [key,value] of Object.entries(reminderDoc.data())) {
if (key == 'boss' || key == 'user') console.log(`${key}: ${value.path}`)
else if (key == 'startAt') console.log(`${key}: ${value.toDate()}`)
else console.log(`${key}: ${value}`)
});
我直接在 nodejs 中对此进行了测试,但它应该也适用于 componentDidMount
。