问题
我正在使用 graphql 开发 next.js 应用程序,并且我正在尝试从我的应用程序创建内容。
当我运行突变查询时,我得到这个:
Error: Mutation failed due to permission errors: {"response":{"errors":[{"message":"Mutation failed due to permission errors","extensions":{"code":"403","failedActions":[{"action":"create","model":"NousContacter","stage":"DRAFT"}]}}],"data":null,"extensions":{"requestId":"cl47gsed70qm30bt92jr1df04"},"status":403,"headers":{"map":{"cache-control":"private, no-store","content-type":"application/json"}}},"request":{"query":"\n\tmutation CreateNousContacter($nom: String!, $email: String!, $message: String! ) {\n\t\tcreateNousContacter(data: {nom: $nom, email: $email, message: $message}){id}}","variables":{"nom":"TESTname","email":"TESTmail","message":"TESTmessage"}}}
我的获取查询都可以正常工作,没有任何问题,但这是我编写的第一个突变,我不知道如何让它工作。
我的要求
import { request, gql } from 'graphql-request';
const graphqlAPI = process.env.NEXT_PUBLIC_GRAPHCMS_ENDPOINT;
export const nousContacter = async ({ nom, email, message }) => {
const query = gql`
mutation CreateNousContacter($nom: String!, $email: String!, $message: String!){
createNousContacter(data: {nom: $nom, email: $email, message: $message}) {
id
}
}`;
await request(graphqlAPI, query, {nom, email, message});
};
在图形方面,我的模型的所有字段都是读/写的
额外问题
1-每当我让我的突变发挥作用时,我如何创建我的内容并将其直接放入发布阶段?我还没能在图形 API 游乐场上做到这一点
2- 我可以在只读字段的情况下做我想做的事情吗?
此消息“由于权限错误,突变失败” 这意味着您授予了写入内容的权限,但在写入后,您正在尝试读取返回值,但您尝试读取的返回值很可能会被读取为已发布。
再次授予您的模型以草稿形式读取的权限
您必须授予您的特定令牌的所有权限:
设置 -> 永久身份验证令牌 -> 编辑令牌并授予其所有权限。
您需要从 graphcms 生成一个永久令牌,将其添加到 .env 并在标头中调用它,如下所示:
import { GraphQLClient, gql } from 'graphql-request';
const graphqlAPI = process.env.NEXT_PUBLIC_GRAPHCMS_ENDPOINT;
const graphcmsToken = process.env.GRAPHCMS_TOKEN
export const nousContacter = async ({ nom, email, message }) => {
const graphQLClient = new GraphQLClient(graphqlAPI, {
headers: {
authorization: `Bearer ${graphcmsToken}`
}
})
const query = gql`
mutation CreateNousContacter($nom: String!, $email: String!, $message: String!){
createNousContacter(data: {nom: $nom, email: $email, message: $message}) {
id
}
}`;
await GraphQLClient.request(query, {nom, email, message});
};
我想你正在使用
GraphCMS
,现在称为 hygraph
。我只想回答额外的问题:
不可以,您不能创建内容并直接将其放入
PUBLISHED
阶段。create*
突变只能在 DRAFT
阶段创建内容。您只能在DRAFT
阶段创建内容后才能发布内容。Hygraph
自动生成(更多详细信息 https://hygraph.com/docs/api-reference/content-api/mutations#publishing-content-mutations)。
以下为发布突变
import { request, gql } from 'graphql-request';
const graphqlAPI = process.env.NEXT_PUBLIC_GRAPHCMS_ENDPOINT;
export const nousContacter = async (id) => {
const query = gql`
mutation PublishNousContacter($id: ID!) {
PublishNousContacter(where: { id: $id }, to: PUBLISHED) {
id
}
}`;
await request(graphqlAPI, query, { id });
};
注意:对于嵌套对象,您必须单独或批量请求发布所有嵌套对象。