我正在编写一个Firebase云函数,它将编写一个Firestore文档,然后将文档的唯一ID返回到Flutter应用程序。我正在使用Typescript编写函数。
这是编写文档的代码:
db.collection('devices').doc().set({"deviceId": userId},{merge: true})
.then((docRef: FirebaseFirestore.DocumentReference<FirebaseFirestore.DocumentData>) => {
functions.logger.info(`Document path: ${docRef.path}`,{structuredData: true});
functions.logger.info(`Document written with ID: ${docRef.id}`,{structuredData: true});
response.status(200).send({"result":"success", "docId": docRef.id});
})
.catch((error: Error) => {
functions.logger.error(error,{structuredData: true});
response.status(200).send({"result":"error", "message": error.message});
});
set
方法返回一个promise,该promise具有类型为DocumentReference
并包含id
的有效载荷。文档正在写入Firestore
,但它没有得到DocumentReference
的值,所以我可以在响应中发回它。
set()
方法返回一个只有writeTime
属性的WriteResult对象。返回DocumentReference
的是add()
方法,所以请尝试使用它,如下所示:
db.collection("devices").add({ deviceId: userId })
.then((docRef) => {
functions.logger.info(`Document written with ID: ${docRef.id}`,{structuredData: true});
})
如果你想使用set()
,那么你必须将文档ID存储在它之前,如下所示:
const newDocRef = db.collection("devices").doc();
newDocRef.set({ deviceId: userId })
.then(() => {
functions.logger.info(`Document written with ID: ${newDocRef.id}`,{structuredData: true});
})
无论哪种方式,您都不需要{merge: true}
,因为它们将创建一个新文档。