GraphQL - невозможно обновить строку таблицы - PullRequest
0 голосов
/ 13 января 2019

Допустим, у меня есть таблица Person с атрибутами id и name. Сервер GraphQL полностью настроен на Postgraphile и работает так, как я могу запрашивать и создавать новую запись. Однако я не смог его обновить. Почесывая голову снова и снова, я все еще не могу найти причину этого.

Это та мутация, которую я пробовал, которая время от времени подводила меня.

mutation($id: Int!, $patch: PersonPatch!) {
  updatePersonById(input: { id: $id, patch: $patch }) {
    clientMutationId
  }
}

Переменные

{
    id: 1, 
    patch: {"name": "newname"}
}

Я использовал Altair GraphQL client для отправки запроса на мутацию, и сообщение об ошибке вернулось "No values were updated in collection 'people' because no values were found."

Лицо id = 1 существует, что подтверждается отправкой запроса personById для получения его имени. Но я просто не смог обновить его имя.

Редактировать # 1

Ниже приведен gql, сгенерированный Altair GraphQL Client

updatePersonById(
  input: UpdatePersonByIdInput!
): UpdatePersonPayload


input UpdatePersonByIdInput {
  clientMutationId: String
  patch: PersonPatch!
  id: Int!
}

input PersonPatch {
  id: Int
  name: String
}

1 Ответ

0 голосов
/ 14 января 2019

Если вы используете безопасность на уровне строк (RLS), похоже, что обновляемая строка не передает требуемые политики безопасности для текущего пользователя, прошедшего проверку подлинности.

Вот небольшой пример; Вы захотите настроить его под свою систему разрешений

create table person (id serial primary key, name text);
alter table person enable row level security;
grant select, insert(name), update(name), delete on person to graphql;
create policy select_all on person for select using (true);
create policy insert_all on person for insert with check(true);
create policy update_self on person for update using (id = current_person_id());
create policy delete_self on person for delete using (id = current_person_id());

, где

create function current_person_id() returns int as $$
  select nullif(current_setting('jwt.claims.person_id', true), '')::int;
$$ language sql stable;

Если вам нужны дополнительные указания, смело заходите в Графический чат .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...