Appsync 更新和删除突变不起作用
Posted
技术标签:
【中文标题】Appsync 更新和删除突变不起作用【英文标题】:Appsync Update and Delete mutation not working 【发布时间】:2020-07-07 16:30:54 【问题描述】:我正在为我的 APP 使用 AppSync。这是我的 Schema.graphql 文件的快速浏览
type Item @model
@auth(rules: [
allow: public, provider: apiKey, operations: [read] ,
allow: groups, groups: ["admin"]
])
id: ID!
name: String!
soldUnits: String!
soldAs: [Float!]
price: Float!
isAvailable: Boolean!
availableAmount: Float!
category: String!
isVeg: Boolean!
offer: [String!]
about: String
storage: String
benifits: String
otherInfo: String
rating: Int
keywords: [String!]
reviews: [String]
images: [String]
updatedBy: String
addedBy: String
qty: Int
inventroy: Inventory @connection(name: "ItemInventory")
type User @model
id: ID!
firstName: String!
lastName: String!
about: String
phoneNumber: String
email: String
countryCode: String
addresses: [Address] @connection
orders: [Order] @connection(name: "OwnOrder")
type CartItem
id: ID!
count: Int!
name: String!
price: Float
type Address @model
id: ID!
lat: Float!
long: Float!
fullAddress: String!
apartment: String!
street: String
area: String!
district: String!
city: String
state: String!
zip: Int!
country: String!
phoneNumber: String!
type InventoryAddress @model
id: ID!
address: Address @connection
inventroy: Inventory! @connection(name: "InventoryAddress")
type Order @model
id: ID!
orderdate: AWSDate!
ordertime: AWSTime!
deliverySlot: String!
deliveryDate: AWSDate!
deliveryInput: String!
deliveryPhoneNumber: String!
deliveryPhoneCountryCode: String!
deliveryAddress: String!
deliveredTime: AWSDate
deliveredDate: AWSDate
deliveryCharges: Float!
totalAmount: Float!
paidAmount: Float!
discount: Float!
unpaidAmount: Float!
status: String!
paymentMethod: String!
paymentId: String!
itemsCount: Int!
items: [CartItem]
deliverAssignedTo: Patron @connection(name: "PatronOrder")
owner: User @connection(name: "OwnOrder")
inventroyDetails: Inventory @connection(name: "InventoryOrder")
type Patron @model
id: ID!
age: Int!
firstName: String!
lastName: String!
about: String
workTime: String
rating: Int!
reviews: [String]
addressProof: String!
role: String
workArea: Address @connection
address: Address @connection
deliveries: [Order] @connection(name: "PatronOrder")
inventroyDetails: Inventory! @connection(name: "PatronInventory")
addedItems: [Item] @connection
type Inventory @model
id: ID!
address: InventoryAddress @connection(name: "InventoryAddress")
patron: [Patron] @connection(name: "PatronInventory")
items: [Item] @connection(name: "ItemInventory")
orders: [Order] @connection(name: "InventoryOrder")
manager: Patron @connection
admins: [Patron] @connection
这是我在 AppSync 中生成的 GraphQL Schema。 我可以查询数据并创建突变,但更新和删除突变不起作用。
mutation UpdateAddressInput
updateAddress(input:
id:"af5cd7e6-8213-48b6-aa8e-9d2d6999742c",
area:"New Delhi"
)
id,
area
这是一个示例查询,您可以在下面看到返回数据,它没有反映在 dynamoDB 中
"data":
"updateAddress":
"id": "af5cd7e6-8213-48b6-aa8e-9d2d6999742c",
"area": "Electronic City"
【问题讨论】:
你发现了吗?我在同一条船上。我可以创建一个记录,然后我不能更新它,只有版本增加。 【参考方案1】:即使使用 AWS Amplify,我也更喜欢转到 AppSync 控制台并选择查询和突变,这样您就可以看到正在发生的事情以及在幕后需要什么来进行突变。
下面是从 AppSync 控制台中提取的更新突变样本 - 而不是使用来自 Amplify 的 codegen
。
input UpdateRuralAddressInput
id: ID!
latitude: String
longitude: String
stateCity: String
status: Int
_version: Int
请注意,version 字段是更新所必需的。
我只是指出它来帮助其他人解决这个问题,这就是我在 Lambdas 中使用 Amplify + Appsync 客户端的方式
因此,在应用任何更新突变之前,请执行 "get by id" query
,并相应地更新来自请求正文的模型。这样,不仅 version 字段保持正常,其他方面也保持正常。
Lambda 处理程序函数中的更新示例。
注意:您需要删除属性__typename
const updateRuralAddressRequest = JSON.parse(event.body);
const client = await appsyncClient.hydrated();
const ruralAddressQuery = await client.query( query: gql(queryRuralAddress), variables: id: updateRuralAddressRequest.id );
const ruralAddressFromDb = ruralAddressQuery.data.getRuralAddress;
const updateRuralAddressInput = ...ruralAddressFromDb, ...updateRuralAddressRequest ;
delete updateRuralAddressInput.__typename;
const data = await client.mutate( mutation: gql(updateRuralAddressMutation), variables: updateRuralAddressInput );
请注意,我的查询和更新突变都必须包含 version
字段。
export const queryRuralAddress = `
query GetRuralAddressByID($id: ID!)
getRuralAddress(id: $id)
id,
latitude,
longitude,
stateCity,
status,
_version
`;
export const updateRuralAddressMutation = `
mutation UpdateRuralAddress($updateRuralAddressInput:UpdateRuralAddressInput!)
updateRuralAddress(input: $updateRuralAddressInput)
id
latitude
longitude
stateCity
status,
_version
`;
【讨论】:
【参考方案2】:您将在 dynamoDB 表中看到一个自动生成的字段“_version”。查看要更新区域字段的ID的_version值。当您获取地址时,您将获得一个字段“_version”。 试试这样的东西
mutation UpdateAddressInput
updateAddress(input:
id:"af5cd7e6-8213-48b6-aa8e-9d2d6999742c",
area:"New Delhi",
_version:variable name // _version value in dynamoDB table for
// the desired row.
)
id,
area
【讨论】:
我遇到了同样的问题,版本增加了,但我设置的数据都没有改变。 在更新的时候,你通过版本了吗?例如,如果数据库中的版本是 11,那么当您想要更新数据集时,您必须传递 _version : 11。 包含版本对我有用...还指出这是多么荒谬。现在您必须查询以获取当前版本然后更新,而不是基于 ID 的单个更新。 运行amplify update api
并对问题回答“否”=>“启用冲突检测”+amplify push
帮助我摆脱了 _version 问题。对我来说,在放大的文档中找不到东西是荒谬的。
我可以确认更新 api 并将“否”回答为“启用冲突检测”可以解决问题。谢谢@Herr_Hansen以上是关于Appsync 更新和删除突变不起作用的主要内容,如果未能解决你的问题,请参考以下文章
从 Lambda 调用 AWS AppSync graphql API