我正在尝试创建一个函数,当设备在应用程序中注册时,会将此设备uid附加到注册设备的已登录用户的uid(这是在另一个自动创建的firestore集合中)当用户注册时)。
这是我的代码:
exports.addDeviceToUser = functions.firestore.document('device-names/{device}').onUpdate((change, context) => {
const currentUser = admin.auth().currentUser;
const deviceName = context.params.device;
var usersRef = db.collection('users');
var queryRef = usersRef.where('uid', '==', currentUser.uid);
if (authVar.exists) {
return queryRef.update({sensors: deviceName}).then((writeResult => {
return console.log('Device attached');
}));
} else {return console.log('Device attachment failed, user not signed in');}
});

我一直收到此错误:" TypeError:无法读取属性' uid'未定义的。"显然我无法访问当前用户的身份验证信息。为什么呢?
答案 0 :(得分:4)
Admin SDK没有当前用户的感觉。当您说admin.auth()
时,您将获得一个Auth对象。从API文档中可以看出,它上面没有currentUser属性。只有Firebase客户端SDK具有当前用户感,因为您使用它来让用户登录。
如果您需要客户端应用程序告诉Cloud Functions代码使用用户的身份,您必须从客户端向其发送ID令牌,并在服务器上验证它。然后,服务器可以知道最终用户是谁,并代表他们执行操作。通常,您使用HTTP类型触发器执行此操作。 Callable functions在客户端和服务器之间自动传输此数据,但您可以使用类似this sample的代码自行手动执行此操作。
目前,Firestore触发器无法立即访问在数据库中进行更改的最终用户。但是,如果您使用用户的Auth UID作为文档的密钥,并使用安全规则保护该文档,则至少可以根据用户对文档所做的更改来推断用户的UID。已更改的文档的ID。
答案 1 :(得分:3)
因为,根据设计,云功能在后端执行,并且在添加/修改数据库中的数据时不保存有关用户通过身份验证的任何信息。
在'device-names/{device}'
文档(从您的应用程序)中编写数据时,您可以包含一个额外的数据,这是当前用户的uid。