我正在本地测试我的Firebase Firestore安全规则和云功能。在我的测试用例中,我正在创建一个用户,然后再次对其进行更新。但是,在更新之前,云功能应该已经运行并创建了更新安全规则中使用的映射,但是似乎并没有在本地进行。
rules_version = '2';
service cloud.firestore {
function userName() {
return get(/databases/$(database)/documents/uid_to_user_name/$(request.auth.uid))
.data
.userName;
}
match /databases/{database}/documents {
match /user/{userName} {
allow read: if signedIn();
allow create: if signedIn()
&& isValidUser(request.resource.data)
&& request.resource.data.uid == request.auth.uid
&& request.resource.data.name == userName;
allow update: if signedIn()
&& isValidUser(request.resource.data)
&& request.resource.data.name == resource.data.name
&& request.resource.data.name == userName
&& request.resource.data.name == userName();
allow delete: if false;
}
}
}
我有一个云函数,该函数触发/ user / {userName}的onWrite,该函数在名为uid_to_user_name的表中创建uid-> userName查找。问题是当我使用@firebase/testing
并运行firebase emulators:start --only firestore,functions
时,似乎两个服务没有完全交互。例如,当我创建一个用户时,它通过了我的安全规则,并且我还看到onWrite触发器已被激活。但是,当我睡眠5秒钟并尝试更新该用户时,安全规则失败,因为uid_to_username
中的映射为undefined
。奇怪的是,在这段时间内,我还从云功能中的uid_to_username
中存储和检索了值,并且该值已经存在。因此,似乎云Firestore写入操作会触发云功能,但是在云功能中完成的写入不会更新Firestore模拟器。有什么方法可以配置吗?