Функция не найдена ошибка: Имя: [получить].в симуляции правил безопасности пожарного депо - PullRequest
5 голосов
/ 02 мая 2019
match /UserProfile {
    match /{uId}{
    allow get: if isUserLoggedIn() && !isUserBlocked(uId);
  }

когда я пытаюсь получить данные из UserProfile / {uId}, используя приведенные выше правила безопасности, он выдает следующую ошибку в хранилище и в коде говорит, что недостаточно разрешений:

Error running simulation — Error: simulator.rules line [199], column [28]. Function not found error: Name: [get].

Теперь определение вышеупомянутых двух функций здесь

function isUserLoggedIn(){
    return request.auth != null;
}

function isUserBlocked(uId){
    return (('blocked' in get(/databases/$(database)/documents/UserSettings/$(uId)).data) && (request.auth.uid in get(/databases/$(database)/documents/UserSettings/$(uId)).data.blocked));
}

первая функция работает очень хорошо но второй не

выдает эту ошибку

и, насколько мне известно, функция в порядке

помогите, пожалуйста, я потратил много времени на эту сложную проблему

что я пробовал

  1. Я прочитал в одной из тем, что это временная проблема но это не так. прошло уже более 48 часов
  2. где-то также упоминалось, что это ошибка только в симуляторе, но код будет работать без сбоев, и даже это не так. в коде ошибка недостаточных разрешений, как я ожидал
  3. Я правильно прочитал документы, поэтому мой код в порядке, проверил метод get в других правилах, и там он работает нормально

Вот пожалуйста, помогите

1 Ответ

4 голосов
/ 02 мая 2019

Обновление: ошибки - ошибка в симуляторе правил, см. Комментарий Дуга ниже.

Я опробовал ваши правила, и они работали, как и ожидалось, в симуляторе.

Правила:

match /UserProfile {
  function isUserLoggedIn(){
    return request.auth != null;
  }

  function isUserBlocked(uId){
    return (('blocked' in get(/databases/$(database)/documents/UserSettings/$(uId)).data) && (request.auth.uid in get(/databases/$(database)/documents/UserSettings/$(uId)).data.blocked));
  }

  match /{uId}{
    allow get: if isUserLoggedIn() && !isUserBlocked(uId);
  }
}

Тестовый запрос в симуляторе:

get /UserProfile/foo
Authenticated: Yes
Firebase UID: bar

Запрос выполняется или не выполняется на основании документа UserSettings/foo в базе данных:

Запретитьrequest:

/UserSettings/foo    
{
 content: "my content"
 blocked: { bar: true }
}

Разрешает запрос:

/UserSettings/foo    
{
 content: "my content"
 blocked: { otheruser: true }
}

Я думаю, что ошибки могут появляться, когда данные не существуют или не находятся в ожидаемом формате.

Например, если я удаляю документ /UserSettings/foo, я также получаю:

Error: simulator.rules line [58], column [28]. Function not found error: Name: [get].

Я также получаю эту ошибку, если поле blocked отличается от карты (поскольку in являетсяфункция для карт):

Error: simulator.rules line [58], column [95]. Function not found error: Name: [in].

Вероятно, вы можете устранить эти ошибки, используя exists и проверив тип blocked, но в любом случае ваши правила все равно должны отклонять запрос, как и ожидалось.

...