我正在将 AWS amplify 与 graphql 和 appsync 结合使用。 当我执行标准列表查询时,appsync 在它返回的项目列表中包含已删除的项目。
我该怎么做才能使其仅返回未删除的项目?
我尝试了这个查询,但它抛出了一个错误:
query MyQuery($filter: ModelFrameFilterInput = {_deleted: {ne: true}}) {
listFrames(filter: $filter) {
items {
_deleted
name
id
}
}
}
这是错误消息:
"message": "Validation error of type BadValueForDefaultArg: Bad default value ObjectValue{objectFields=[ObjectField{name='_deleted', value=ObjectValue{objectFields=[ObjectField{name='ne', value=BooleanValue{value=true}}]}}]} for type ModelFrameFilterInput"
尚不支持此功能 查看this问题/功能请求 建议使用一种解决方法,在 graphql 模式的过滤器输入中添加
_deleted
。
input ModelTodoFilterInput {
id: ModelIDInput
name: ModelStringInput
description: ModelStringInput
and: [ModelTodoFilterInput]
or: [ModelTodoFilterInput]
not: ModelTodoFilterInput
_deleted: ModelBooleanInput
}
您可以做的一件事是禁用冲突解决程序,如果您没有必要的话,“删除使用冲突解决方案的元素后,它们不会立即从数据库中删除。相反,会添加两个标志:设置了
_deleted
设置为 true,并且 _ttl
设置为使该对象在 30 天后过期。”请参阅:错误“冲突解决程序拒绝突变。”当在放大中删除时
要禁用它,请运行
amplify update api
,系统将提示您选择禁用冲突解决程序
但是如果您使用DataStore,则必须启用冲突解决程序。这样的话,我不知道如何解决。
这是使用 ConflictResolution 时的一个已知问题。我过去也遇到过这个问题。我的解决方案是使用 DynomoDB Streams Trigger 和 AWS Amplify 来侦听 DynamoDB 更新事件,然后通过 Lambda 删除记录。
这里是 AWS Amplify GraphQL Lambda 触发器的官方文档
DynamoDB 触发器几乎是实时的,因此即使使用 128MB Lambda 也能很好地工作
您可以尝试将
_deleted: { ne: true }
添加到您的过滤器中,如下所示:
const resp = API.graphql<GraphQLQuery<ListTodosQuery>>({
query: queries.listTodos,
variables: {
filters: {
_deleted: { ne: true }
}
}
});