如何防止删除的记录出现在我的 AWS Amplify GraphQL 结果中?

问题描述 投票:0回答:2

默认情况下,Amplify GraphQL API 返回已删除的项目。

更糟糕的是,据我所知,显然没有办法过滤它们:

syncXYZTable
listXYZTable
查询都不接受
_deleted
字段作为参数。幸运的是,DataStore SDK 中生成的代码会过滤掉这些项目,并且(有点令人困惑)Amplify Studio 不会显示它们(在“内容”选项卡中);但这只会凸显不一致之处:例如,作为开发人员,我在任何地方都看不到已删除的项目,但作为使用 GraphQL API 的数据科学家或经理,我(似乎)无法避免它们。

我是不是错过了什么?难道真的没有办法使用 Amplify GraphQL API 过滤掉已删除的项目吗?

graphql aws-amplify
2个回答
0
投票

我在开发一个具有多个前端的项目时遇到了这个问题,一个使用数据存储,另一个不使用数据存储,所以我制作了 lambda 函数来清理表中任何已删除的记录,如果您喜欢这种方法,请按照以下步骤操作:

1- 转到 AWS 控制台并创建新的 lambda 函数“DeleteItemsForDatastore”

2-转到执行角色下的功能配置,单击角色名称链接,这会将您重定向到角色页面,单击添加权限并选择附加策略,然后搜索

'AWSLmbdaInvocation-DynamoDB'
并添加它,然后再次单击 添加权限 选择 创建内联策略 并搜索
DynamoDB
,然后在 write 部分选择
'DeleteItem'
并添加它。

3- 现在更新您的 lambda 代码

import { DynamoDBClient, DeleteItemCommand } from '@aws-sdk/client-dynamodb'

export const handler = async (event) => {
  
  const client = new DynamoDBClient({ region: 'us-east-1' })
  
 console.log(`EVENT: ${JSON.stringify(event)}`)
 
  for (const record of event.Records) {
      console.log('Data---> ', record.dynamodb)
      const tableName = record.eventSourceARN.split('/')[1] 
       const params = {
          TableName: tableName,
          Key: record.dynamodb.Keys,
        }
        
        const command = new DeleteItemCommand(params)
        const r = await client.send(command)
        console.log('response--> ', r)
  }
  const response = {
    statusCode: 200,
    body: JSON.stringify('Items Deleted Successfuly!'),
  };
  return response;
};

然后部署,此代码将删除事件中的所有记录,但不用担心,我们将在下一步中添加过滤器。

4-转到触发器上的lambda配置,单击添加触发器并搜索

DynamoDB
,然后从列表中选择您的表名称,然后将批量大小更改为1,然后向下单击其他设置单击添加过滤条件并通过此条件

{ "dynamodb": { "NewImage": { "_ttl": { "N": [ { "exists": true } ] } } } }

现在只有当记录具有 _ttl(仅存在于已删除的项目上)时,该函数才会调用这将减少调用成本,现在您可以向所有要从中清除已删除项目的表添加触发器


-1
投票

我必须在代码中过滤这些_deleted 记录。没有找到在 GraphQL Response 中过滤掉的方法

© www.soinside.com 2019 - 2024. All rights reserved.