由 amplify 生成的 Graphql 查询运行良好,但由于身份验证规则而抛出错误。为什么?
Graphql queries generated by amplify work well, but throw errors due to auth rules. Why?
总结:
我正在使用 aws-amplify 生成的 javascript 将查询和突变发送到具有 dynamodb 后端的 AWS graphql 端点。 queries/mutations 功能足够好(它们按预期创建、获取和删除记录)。但是他们在这个过程中不断抛出错误:
"Query condition missed key schema element: authorId (Service: AmazonDynamoDBv2; Status Code: 400; Error Code: ValidationException;"
我的代码不会太差,不然怎么这么好用?尽管如此,我还是想摆脱这个恼人的错误,或者至少理解它。为什么会出现此错误?
详情:
我的 api 是从 aws-sample "aws-appsync-chat" 中提供的确切 schema.graphql 文件生成的
https://github.com/aws-samples/aws-appsync-chat
模型的相关部分在这里...
type User
@model
@auth(rules: [{ allow: owner, ownerField: "id", queries: null }]) {
id: ID!
username: String!
conversations: [ConvoLink] @connection(name: "UserLinks")
messages: [Message] @connection(name: "UserMessages")
createdAt: String
updatedAt: String
}
遗憾的是,该样本并没有真正使用放大生成的查询和突变。相反,它在文件中使用手写模式:src/graphql.js。那就对了。生成的 queries/mutations 包含在项目中,但未实际使用。这让我非常失望。但是当我设法重写 javascript 逻辑以使用由 amplify 生成的查询和突变使其(或多或少)起作用时,我的信心(在某种程度上)恢复了。
无论如何,我采取的第一步是编写以下逻辑:(1) 查询用户 table 以查看当前授权用户的记录是否已经存在,以及 (2) 如果存在则创建记录授权用户不存在。为了加分,我还写了(3)从数据库中删除用户记录的逻辑。
在 vuejs 组件内部工作,我编写了这些方法...
methods: {
async DeleteUserRecord() {
try {
let id = store.state.user.username;
const input = { id: id };
await API.graphql(graphqlOperation(deleteUser, { input }));// works but throws errors
} catch (err) {
console.log('Error deleting user record:', err)
}
},
async GetUserRecord() {
try {
let id = store.state.user.username;
const result = await API.graphql(graphqlOperation(getUser, { id }));// works but throws errors
console.log(result);
} catch (err) {
console.log('Error getting user record:', err)
}
},
async CreateUserRecord() {
let username = store.state.user.username;
try {
const result = await API.graphql(graphqlOperation(createUser, { input:{ id:username, username: username } })) // works but throws error
console.log(result);
} catch (err) {
console.log('Error creating user record:', err)
}
}
}
这三个似乎都可以工作,但它们确实会抛出错误,有关详细信息,请参见随附的屏幕截图。
总是同样的错误:
"Query condition missed key schema element: authorId (Service: AmazonDynamoDBv2; Status Code: 400; Error Code: ValidationException;"
错误必须与模型中的授权规则有关。但请记住,我的代码确实有效,所以我的代码不完全是废话。
任何人都可以向我解释这个错误吗?它是 AWS 中的错误吗?还是我的代码写错了?
-------------------------------- 下面更新-------- ----------------------
我仍然不明白为什么会出现这个错误,但我在理解它方面有了一些进步。
如屏幕截图所示,如果我删除请求用户消息的部分,由 amplify 生成的 getUser 查询将起作用。
错误消息中出现的authorId必须来自Message对象的数据模型。
请注意,graphql 模式使用命名连接 link 向用户发送消息,keyField 为 "authorId"。
因此,我可以通过修改数据模型中的连接规范来消除错误。
但是等等。这些是由 amplify 生成的默认查询,只需为其提供一个完全来自 aws-sample 项目的模式。如果我不编辑它们,这些查询难道不能很好地工作吗?
我遇到了和你一样的问题。
我在 github https://github.com/aws-amplify/amplify-cli/pull/1358
中找到了工作示例
type Post @model {
id: ID!
name: String!
comments: [Comment] @connection(name: "PostComments", keyField: "postId", sortField: "statusDate")
}
type Comment @model(queries: null) {
id: ID!
post: Post! @connection(name: "PostComments", keyField: "postId", sortField: "statusDate")
postId: ID!
statusDate: String!
}
@connection 属性两端的 KeyField 必须相同。在 github 教程的示例表单中,缺少的部分是来自用户类型的 "authorId":
type User
@model
@auth(rules: [{ allow: owner, ownerField: "id", queries: null }]) {
id: ID!
username: String!
conversations: [ConvoLink] @connection(name: "UserLinks")
messages: [Message] @connection(name: "UserMessages", keyField: "authorId")
createdAt: String
updatedAt: String
}
另外,最好在Message类型中将authorId设为非null值,因为没有作者就无法发布消息
type Message @model @auth(rules: [{ allow: owner, ownerField: "authorId" }]) {
id: ID!
author: User @connection(name: "UserMessages", keyField: "authorId")
authorId: String!
content: String!
conversation: Conversation! @connection(name: "ConvoMsgs")
messageConversationId: ID!
createdAt: String
updatedAt: String
}
总结: 我正在使用 aws-amplify 生成的 javascript 将查询和突变发送到具有 dynamodb 后端的 AWS graphql 端点。 queries/mutations 功能足够好(它们按预期创建、获取和删除记录)。但是他们在这个过程中不断抛出错误:
"Query condition missed key schema element: authorId (Service: AmazonDynamoDBv2; Status Code: 400; Error Code: ValidationException;"
我的代码不会太差,不然怎么这么好用?尽管如此,我还是想摆脱这个恼人的错误,或者至少理解它。为什么会出现此错误?
详情:
我的 api 是从 aws-sample "aws-appsync-chat" 中提供的确切 schema.graphql 文件生成的 https://github.com/aws-samples/aws-appsync-chat
模型的相关部分在这里...
type User
@model
@auth(rules: [{ allow: owner, ownerField: "id", queries: null }]) {
id: ID!
username: String!
conversations: [ConvoLink] @connection(name: "UserLinks")
messages: [Message] @connection(name: "UserMessages")
createdAt: String
updatedAt: String
}
遗憾的是,该样本并没有真正使用放大生成的查询和突变。相反,它在文件中使用手写模式:src/graphql.js。那就对了。生成的 queries/mutations 包含在项目中,但未实际使用。这让我非常失望。但是当我设法重写 javascript 逻辑以使用由 amplify 生成的查询和突变使其(或多或少)起作用时,我的信心(在某种程度上)恢复了。
无论如何,我采取的第一步是编写以下逻辑:(1) 查询用户 table 以查看当前授权用户的记录是否已经存在,以及 (2) 如果存在则创建记录授权用户不存在。为了加分,我还写了(3)从数据库中删除用户记录的逻辑。
在 vuejs 组件内部工作,我编写了这些方法...
methods: {
async DeleteUserRecord() {
try {
let id = store.state.user.username;
const input = { id: id };
await API.graphql(graphqlOperation(deleteUser, { input }));// works but throws errors
} catch (err) {
console.log('Error deleting user record:', err)
}
},
async GetUserRecord() {
try {
let id = store.state.user.username;
const result = await API.graphql(graphqlOperation(getUser, { id }));// works but throws errors
console.log(result);
} catch (err) {
console.log('Error getting user record:', err)
}
},
async CreateUserRecord() {
let username = store.state.user.username;
try {
const result = await API.graphql(graphqlOperation(createUser, { input:{ id:username, username: username } })) // works but throws error
console.log(result);
} catch (err) {
console.log('Error creating user record:', err)
}
}
}
这三个似乎都可以工作,但它们确实会抛出错误,有关详细信息,请参见随附的屏幕截图。
总是同样的错误: "Query condition missed key schema element: authorId (Service: AmazonDynamoDBv2; Status Code: 400; Error Code: ValidationException;"
错误必须与模型中的授权规则有关。但请记住,我的代码确实有效,所以我的代码不完全是废话。
任何人都可以向我解释这个错误吗?它是 AWS 中的错误吗?还是我的代码写错了?
-------------------------------- 下面更新-------- ----------------------
我仍然不明白为什么会出现这个错误,但我在理解它方面有了一些进步。
如屏幕截图所示,如果我删除请求用户消息的部分,由 amplify 生成的 getUser 查询将起作用。
错误消息中出现的authorId必须来自Message对象的数据模型。
请注意,graphql 模式使用命名连接 link 向用户发送消息,keyField 为 "authorId"。
因此,我可以通过修改数据模型中的连接规范来消除错误。
但是等等。这些是由 amplify 生成的默认查询,只需为其提供一个完全来自 aws-sample 项目的模式。如果我不编辑它们,这些查询难道不能很好地工作吗?
我遇到了和你一样的问题。
我在 github https://github.com/aws-amplify/amplify-cli/pull/1358
中找到了工作示例type Post @model {
id: ID!
name: String!
comments: [Comment] @connection(name: "PostComments", keyField: "postId", sortField: "statusDate")
}
type Comment @model(queries: null) {
id: ID!
post: Post! @connection(name: "PostComments", keyField: "postId", sortField: "statusDate")
postId: ID!
statusDate: String!
}
@connection 属性两端的 KeyField 必须相同。在 github 教程的示例表单中,缺少的部分是来自用户类型的 "authorId":
type User
@model
@auth(rules: [{ allow: owner, ownerField: "id", queries: null }]) {
id: ID!
username: String!
conversations: [ConvoLink] @connection(name: "UserLinks")
messages: [Message] @connection(name: "UserMessages", keyField: "authorId")
createdAt: String
updatedAt: String
}
另外,最好在Message类型中将authorId设为非null值,因为没有作者就无法发布消息
type Message @model @auth(rules: [{ allow: owner, ownerField: "authorId" }]) {
id: ID!
author: User @connection(name: "UserMessages", keyField: "authorId")
authorId: String!
content: String!
conversation: Conversation! @connection(name: "ConvoMsgs")
messageConversationId: ID!
createdAt: String
updatedAt: String
}