AWS Amplify中用Axios发送GraphQL更新请求报错求指导
AWS Amplify GraphQL更新请求报错处理
我用AWS Amplify开发应用,要在Node.js API函数里创建一个端点来修改GraphQL中的字段。由于该API函数仅支持ES5,无法使用AWS文档中推荐的ES6库,因此选择使用Axios。
我编写的GraphQL查询如下:
const query = /* GraphQL */ `mutation updatePublication($id: ID!, $keywords: String) { updatePublication(id: $id, keywords: $keywords){ id keywords } }`
Axios请求代码:
const data = await axios.post( process.env.API_APPNAME_GRAPHQLAPIENDPOINTOUTPUT, { query: query, variables: { id: variableWithID, keywords: "updated keywords!" } }, { headers: { 'Content-Type': 'application/json', 'x-api-key': process.env.API_APPNAME_GRAPHQLAPIKEYOUTPUT } } )
运行请求后返回状态码200,但附带错误信息:
{ data: null, errors: [ { path: null, locations: [Array], message: "Validation error of type MissingFieldArgument: Missing field argument input @ 'updatePublication'" }, { path: null, locations: [Array], message: "Validation error of type UnknownArgument: Unknown field argument id @ 'updatePublication'" }, { path: null, locations: [Array], message: "Validation error of type UnknownArgument: Unknown field argument keywords @ 'updatePublication'" } ] }
错误原因
这些错误的核心是Amplify自动生成的GraphQL更新mutation要求参数通过input对象传递,而非直接传字段:
MissingFieldArgument:updatePublicationmutation必须接收一个名为input的参数,你没传UnknownArgument:你直接传递的id、keywords并不是updatePublication定义的顶层参数,所以被判定为未知参数
解决方法
1. 修改GraphQL mutation的写法
调整变量定义和mutation调用,用input对象承载参数:
const query = /* GraphQL */ `mutation updatePublication($input: UpdatePublicationInput!) { updatePublication(input: $input){ id keywords } }`
2. 调整Axios请求的变量结构
把id和keywords打包到input对象中:
const data = await axios.post( process.env.API_APPNAME_GRAPHQLAPIENDPOINTOUTPUT, { query: query, variables: { input: { id: variableWithID, keywords: "updated keywords!" } } }, { headers: { 'Content-Type': 'application/json', 'x-api-key': process.env.API_APPNAME_GRAPHQLAPIKEYOUTPUT } } )
补充说明
Amplify根据数据模型自动生成的CRUD mutation,统一使用input对象作为参数载体,这是它的规范。你可以查看项目中amplify/backend/api/[你的API名称]/schema.graphql文件,确认UpdatePublicationInput的结构,确保传入的字段符合定义。
内容的提问来源于stack exchange,提问作者Pythoner
相关产品推荐
相关产品推荐

