извините, если мой вопрос - duplicatd, но я не нашел других сообщений об этой проблеме!
Я хочу разрешить пользователю создавать новый /packages/
документ, только если вновь созданные данные содержат поле со ссылкой на их users/{uid}
документ.
Я уже использую следующую функцию для сравнения ссылки при записи в документ (находится здесь: { ссылка }, что является отличным ответом кстати!):
function refMatch(field) {
return request.auth != null && request.auth.uid != null && field in resource.data
&& resource.data[field] == /databases/$(database)/documents/users/$(request.auth.uid)
}
Я изменил его, чтобы получить доступ к данным из запроса (еще не представлен в документе):
function createdRefMatch(field) {
return request.auth != null && request.auth.uid != null && field in request.resource.data
&& request.resource.data[field].path == /users/$(request.auth.uid)
}
Используется так:
match /packages/{packageId} {
allow create: if createdRefMatch('user');
}
Проблема в том, что даже строка request.resource.data[field].path == /users/$(request.auth.uid)
выглядит так, как будто она должна выполнять свою работу, сравнение всегда ложно. Когда я отлаживаю значения в firebase, оказывается, что левая сторона всегда является объектом ({"field":"..."}
), а правая сторона является строкой. Похоже, это ничего не меняет, если я использую .path
или нет, отладчик всегда показывает объект вместо значения.
Я также пытался сравнить два объекта (не уверен, возможно ли это в любом случае ) но тогда проблема в том, что одно из значений field
начинается с sla sh, а другое - нет.
Я даже пытался изменить сравнение следующим образом:
/databases/$(database)/documents/$(request.resource.data[field].path) == /databases/$(database)/documents/users/$(request.auth.uid)
Но тогда часть $(request.resource.data[field].path)
каким-то образом заменяет sla sh на URL-значение с процентами.
Пожалуйста, кто-то может указать, что я могу изменить, чтобы это работало? Похоже, что различные способы манипулирования этими данными изменяют сами данные. Это действительно ад:)
Спасибо за ваше время!