默认情况下,Amplify GraphQL API 返回已删除的项目。
更糟糕的是,据我所知,显然没有办法过滤它们:
syncXYZTable
和listXYZTable
查询都不接受_deleted
字段作为参数。幸运的是,DataStore SDK 中生成的代码会过滤掉这些项目,并且(有点令人困惑)Amplify Studio 不会显示它们(在“内容”选项卡中);但这只会凸显不一致之处:例如,作为开发人员,我在任何地方都看不到已删除的项目,但作为使用 GraphQL API 的数据科学家或经理,我(似乎)无法避免它们。
我是不是错过了什么?难道真的没有办法使用 Amplify GraphQL API 过滤掉已删除的项目吗?
我在开发一个具有多个前端的项目时遇到了这个问题,一个使用数据存储,另一个不使用数据存储,所以我制作了 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(仅存在于已删除的项目上)时,该函数才会调用这将减少调用成本,现在您可以向所有要从中清除已删除项目的表添加触发器
我必须在代码中过滤这些_deleted 记录。没有找到在 GraphQL Response 中过滤掉的方法