1

假设我有一个带有属性的表 Personidname. 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

下面是生成的gqlAltair GraphQL Client

updatePersonById(
  input: UpdatePersonByIdInput!
): UpdatePersonPayload


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

input PersonPatch {
  id: Int
  name: String
}
4

1 回答 1

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 聊天

于 2019-01-13T22:53:09.547 回答