GraphQL - невозможно обновить строку таблицы
Допустим, у меня есть таблица 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 ответ
Предполагая, что вы используете безопасность на уровне строк (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;
Если вам нужно больше рекомендаций, не стесняйтесь заходить в чат Graphile.