问题描述
我是初次使用GraphQL放大功能。我正在运行放大推送后设置数据库模式并自动生成函数。
我想实现的目标,但不知道如何实现
let user = await API.graphql(graphqlOperation(getUser,{id:userId}))
我正在找回一个用户对象,尽管它肯定可以确保数据库中的数据设置正确,但它看起来像这样。
buttons: {nextToken: null} -- WANT THIS TO INCLUDE ACTUAL @R_4_4045@ION ABOUT BUTTONS CONNECTED TO THIS USER
createdAt: "2020-09-02T23:41:12.278Z"
customStyles: {id: "e3d1bbef-ec6f-4a6d-9b5d-e693e890d4e0",bgColor: "F9FF9F",bgBtnColor: "FFFFFF",bgBtnHoverColor: "000000",textColor: "000000",…}
defaultStyles: null
email: "[email protected]"
firstName: "Nata"
id: "d683a6bb-383e-4cf1-943a-05b3da4e5cc3"
lastName: "Vache"
socialNetwork: {nextToken: null} -- WANT THIS TO INCLUDE ACTUAL @R_4_4045@ION ABOUT SOCIAL NETWORKS CONNECTED TO THIS USER,THE SAME WAY AS FOR EXAMPLE customStyles IS SHOWN.
updatedAt: "2020-09-02T23:41:12.278Z"
userName: "Nata568"
type User @model @key(name: "byUserName",fields: ["userName"],queryField: "userByUserName"){
id: ID!
firstName: String!
lastName: String!
userName: String!
email: String!
socialNetwork: [UserSocialNetwork] @connection(keyName: "UserSocialNetworkUser",fields: ["id"])
buttons: [Button] @connection(keyName: "ButtonUser",fields: ["id"])
defaultStyles: DefaultStyle @connection
customStyles: CustomStyle @connection
}
type UserSocialNetwork @model @key(name: "UserSocialNetworkUser",fields: ["userID","id"],queryField:"userSocialNetworkByUserID") {
id: ID!
socialNetworkUsername: String!
userID: ID!
supportedSocialNetwork: SupportedSocialNetwork! @connection
}
type SupportedSocialNetwork @model {
id: ID!
name: String!
address: String!
}
type Button @model @key(name: "ButtonUser",queryField: "buttonByUserID") {
id: ID!
name: String!
address: String!
image: String
userID: ID!
}
此架构并不包括我的所有模型定义-customStyles,defaultStyles和其他模型定义,但它们是一对一的关系,效果很好。我遇到了一对多关系的问题,例如User to UserSocialNetwork和User to Buttons。
我已经在AWS Amplify Docs上阅读了很多相关资源,通过示例进行了研究,但仍然找不到我可以使用的东西,这可以让我从getUser调用中的连接中获取信息,并且还使我能够通过用户名获取用户。 任何输入将不胜感激!!!
解决方法
这是查询深度的问题。默认情况下为 2
,需要增加它(在您的情况下为 4
)。
您可以按照以下步骤解决此问题。 在您的项目根目录中的 cmd 中(您通常在其中运行放大命令)。
- 运行
amplify codegen configure
- 这将再次提示配置。 - 为此选项输入
4
Enter maximum statement depth [increase from default if your schema is deeply nested]
- 运行
amplify codegen
- 这将根据新的深度创建您的查询和变更。
您可以通过检查 grapgql/queries.js
来验证它。
之前,您可以在 getUser
中的 grapgql/queries.js
查询中看到以下片段,
buttons {
nextToken
}
但是按照上面的解析步骤之后,应该是下面这样的。
buttons {
items {
id
image
address
}
}
最后再次查询您的用户。
,一般注释::如果用户名是唯一的,则可以将其用作ID,而不用创建额外的索引。如果不是,则此架构将存在问题,因为它无法执行getOperation,而是执行查询,该查询可能返回多个答案。
(Appsync的解析器默认情况下(和设计)要使用dynamoDB.get
,但是使用索引将是dynamoDB.query
,这会导致很多问题)
无论如何,使用您的架构,我可以使它在使用ID时正常工作
"data": {
"getUser": {
"createdAt": "2020-09-07T13:54:23.440Z","email": "meax","firstName": "Max","id": "19a752ec-5050-4e02-8ff8-05d9523e7ea5","socialNetwork": {
"items": [
{
"socialNetworkUsername": "What","id": "280ec8ea-5b25-46d3-8f22-f170e3210146","userID": "19a752ec-5050-4e02-8ff8-05d9523e7ea5"
}
]
},"lastName": "Sc","userName": "zanndo","updatedAt": "2020-09-07T13:54:23.440Z","buttons": {
"items": [
{
"id": "65971568-b388-40a3-b99e-1bff0a730161","image": null,"address": "ButonAdre"
}
]
}
}
}
}
这是我的查询
getUser(id: "19a752ec-5050-4e02-8ff8-05d9523e7ea5") {
createdAt
email
firstName
id
socialNetwork {
items {
socialNetworkUsername
id
userID
}
}
lastName
userName
updatedAt
buttons {
items {
id
image
address
}
}
}
}
这是我通过电子邮件发送ID的地方。
query MyQuery {
getUser(id: "[email protected]") {
id
firstName
lastName
socialNetwork {
items {
socialNetworkUsername
supportedSocialNetwork {
name
id
address
}
}
}
buttons {
items {
id
address
name
}
}
}
}
也可以
{
"data": {
"getUser": {
"id": "[email protected]","firstName": "S","lastName": "W","socialNetwork": {
"items": [
{
"socialNetworkUsername": "SomeUserNameOrSomething","supportedSocialNetwork": {
"name": "Supported1","id": "daf52246-4b25-402c-9fdd-46f8f35e1b89","address": "SupportedAddr"
}
}
]
},"buttons": {
"items": [
{
"id": "9883bd91-a2f1-479d-ab65-7a4bbe7b2dc4","address": "ButtonAddr","name": "Button1"
}
]
}
}
}
}
使用索引奖励
userByUserName(userName: "SW") {
items {
buttons {
items {
name
id
}
}
socialNetwork {
items {
socialNetworkUsername
supportedSocialNetwork {
name
}
}
}
}
}
"userByUserName": {
"items": [
{
"buttons": {
"items": [
{
"name": "Button1","id": "9883bd91-a2f1-479d-ab65-7a4bbe7b2dc4"
}
]
},"socialNetwork": {
"items": [
{
"socialNetworkUsername": "SomeUserNameOrSomething","supportedSocialNetwork": {
"name": "Supported1"
}
}
]
}
}
]
}
这是我使用的架构
type User @model @key(name: "byUserName",fields: ["userName"],queryField: "userByUserName"){
firstName: String!
lastName: String!
userName: String!
id: String!
socialNetwork: [UserSocialNetwork] @connection(keyName: "UserSocialNetworkUser",fields: ["id"])
buttons: [Button] @connection(keyName: "ButtonUser",fields: ["id"])
}
type UserSocialNetwork @model @key(name: "UserSocialNetworkUser",fields: ["userID","id"],queryField:"userSocialNetworkByUserID") {
id: ID!
socialNetworkUsername: String!
userID: String!
supportedSocialNetwork: SupportedSocialNetwork! @connection
}
type SupportedSocialNetwork @model {
id: ID!
name: String!
address: String!
}
type Button @model @key(name: "ButtonUser",queryField: "buttonByUserID") {
id: ID!
name: String!
address: String!
image: String
userID: String!
}
也许我误会了什么?