typescript 创建解析程序以通过AppSync更新dynamoDB项目- AWS CDK

wwwo4jvm  于 2023-08-07  发布在  TypeScript
关注(0)|答案(2)|浏览(148)

因此,我创建了一个解析器,使用下面的代码在表中创建一个项。

  1. const configSettingsDS = api.addDynamoDbDataSource('configSettingsDynamoTable', configurationSettingsTable);
  2. configSettingsDS.createResolver({
  3. typeName:'Mutation',
  4. fieldName: 'createConfigSettings',
  5. requestMappingTemplate: appsync.MappingTemplate.dynamoDbPutItem(
  6. appsync.PrimaryKey.partition('id').auto(),
  7. appsync.Values.projecting('configSettings')),
  8. responseMappingTemplate: appsync.MappingTemplate.dynamoDbResultItem(),
  9. });

字符串
我似乎找不到一个在更新操作中复制相同的东西。任何帮助都是感激的。谢啦,谢啦

9vw9lbht

9vw9lbht1#

更新解析程序的工作原理与创建解析程序几乎相同。在DynamoDB中,两者的操作都是PutItem,因此应用相同的Map模板。您需要将第一个参数从appsync.PrimaryKey.partion('id').auto()更改为appsync.PrimaryKey.partion('id').is('<PATH_TO_YOUR_ID>')
id可以是作为输入传递的对象的一部分。虽然我更喜欢将它分开,所以id不是输入对象的一部分。下面是两种变体的一个非常基本的示例。

graphql schema:

  1. // Input A includes ID
  2. input InputA {
  3. id: ID!
  4. name: String!
  5. }
  6. // Input B does not include an ID
  7. input InputB {
  8. name: String!
  9. }
  10. type Mutation {
  11. // Id is part of input
  12. updateA(input: InputA)
  13. // Id needs to be provided seperately
  14. updateB(id: ID!, InputB)
  15. }

字符串

解析器编码:

  1. // Configure the resolver where ID is part of the input
  2. const resolverA = datasource.createResolver({
  3. typeName: `Mutation`,
  4. fieldName: `updateA`,
  5. requestMappingTemplate: appsync.MappingTemplate.dynamoDbPutItem(
  6. appsync.PrimaryKey.partition('id').is('input.id'),
  7. appsync.Values.projecting('input'),
  8. ),
  9. responseMappingTemplate: appsync.MappingTemplate.dynamoDbResultItem(),
  10. });
  11. // Configure the resolver where ID is provided as a separate input parameter.
  12. const resolverB = datasource.createResolver({
  13. typeName: `Mutation`,
  14. fieldName: `updateB`,
  15. requestMappingTemplate: appsync.MappingTemplate.dynamoDbPutItem(
  16. appsync.PrimaryKey.partition('id').is('id'),
  17. appsync.Values.projecting('input'),
  18. ),
  19. responseMappingTemplate: appsync.MappingTemplate.dynamoDbResultItem(),
  20. });


我只是不得不为我的项目解决同样的问题。以下是我如何设置它的一些片段:

部分graphql schema:

  1. input Label {
  2. id: ID!
  3. name: String!
  4. imageUrl: String
  5. }
  6. input LabelInput {
  7. name: String!
  8. imageUrl: String
  9. }
  10. type Mutation {
  11. createLabel(input: LabelInput!): Label
  12. updateLabel(id: ID!, input: LabelInput!): Label
  13. }

cdk中对应的解析器:

  1. datasource.createResolver({
  2. typeName: `Mutation`,
  3. fieldName: `createLabel`,
  4. requestMappingTemplate: appsync.MappingTemplate.dynamoDbPutItem(
  5. appsync.PrimaryKey.partition('id').auto(),
  6. appsync.Values.projecting('input'),
  7. ),
  8. responseMappingTemplate: appsync.MappingTemplate.dynamoDbResultItem(),
  9. });
  10. datasource.createResolver({
  11. typeName: 'Mutation',
  12. fieldName: `updateLabel`,
  13. requestMappingTemplate: appsync.MappingTemplate.dynamoDbPutItem(
  14. appsync.PrimaryKey.partition('id').is('id'),
  15. appsync.Values.projecting('input'),
  16. ),
  17. responseMappingTemplate: appsync.MappingTemplate.dynamoDbResultItem(),
  18. });

展开查看全部
lb3vh1jj

lb3vh1jj2#

实际上,DynamoDB提供了一个操作 UpdateItem。但CDK并没有实现它(至少在我看来是这样)。我使用appsync.Values.projecting的问题是,如果我在执行PutItem时不知道表中的所有字段,我会丢失现有字段。

相关问题