我在将新对象添加到集合时触发了云功能。它看起来像这样:
exports.emailAdmin = functions.firestore
.document('user-books/{userId}/books/{ASIN}')
.onWrite(event => {
event.data.data()
是添加到子集合(“书籍”)的对象。 userId
来自Firebase身份验证系统。即用户已登录,并使用他/她的“uid”将对象添加到“user-books”集合中。
我试过了:
firestore
.collection('users')
.doc(uid)
.get()
但是,“当然”,因为我没有名为“用户”的集合而失败。我如何进入“认证数据库”?
目的是将“uid”转换为该人的“电子邮件”。
答案 0 :(得分:3)
导入firebase-admin:
import * as admin from 'firebase-admin';
然后获取身份验证用户:
const uid = ...;
const authUser = await admin.auth().getUser(uid); // this returns a promise, so use await or .then()
console.log(authUser.email);
答案 1 :(得分:2)
您无权访问firebase中的用户集合。我所做的是创建一个单独的用户表,我存储所有用户数据。我在onCreate Hook上将新用户添加到我的集合中,如下所示:
exports.addNewUserToUserTable = functions.auth.user()
.onCreate(event => {
let user = event.data;
let database = admin.firestore();
return database.collection('user').doc(user.uid).set({
email: user.email
});
另一个问题是,目前无法在Firestore数据库触发器上获取登录用户的ID(它适用于实时数据库)。我还在等待这个功能发布......
答案 2 :(得分:0)
似乎您的问题可能不完整 - 您引用了一个没有出现在您的代码段中的event.data.data()行。如果它丢失了,您可以查看并添加吗?
另外,为了澄清您的目的,您希望能够访问已经过身份验证的用户的电子邮件地址,并将其标记为该用户添加的图书?
感谢。
答案 3 :(得分:0)
由于context.auth.uid
无法用于Firestore。您可以为文档分配userId并在规则中阅读。
match /collectionA/{docId} {
allow update: if request.resource.data.userId == request.auth.uid;
}
exports.createProfile = functions.firestore
.document('collectionA/{docId}')
.onCreate((snap, context) => { // or onUpdate
const newValue = snap.data();
const {userId} = newValue;
});