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

Vuex 突变和操作不起作用

嵌套突变似乎在 Lighthouse 3.7 中不起作用

同一视图控制器中的 AWS AppSync 多个订阅不起作用 - iOS Swift

石墨烯突变教程不起作用

使用 ApolloClient 将变量传递给 GraphQL 突变似乎不起作用