为何添加createdAt.between后DataStore.observeQuery不触发INSERT事件?
AWS Amplify DataStore.observeQuery 无法触发INSERT事件问题排查与解决
问题场景
使用aws-amplify v5.3.3版本时,给DataStore.observeQuery添加createdAt.between查询过滤器后,新数据插入DynamoDB时无法触发订阅函数。
代码示例
const subscription = DataStore.observeQuery(Order, (order) => order.and((order) => [ order.createdAt.between(start, end), // 添加该过滤器后,新数据插入时不会触发观察者 order.orderRestaurantId.eq(restaurant?.id), order.or((o) => [ o.status.eq(OrderStatus.ACCEPTED), o.status.eq(OrderStatus.COOKING), o.status.eq(OrderStatus.NEW), o.status.eq(OrderStatus.READY_FOR_PICKUP), ]), ]) ).subscribe((snapshot) => { const { items, isSynced } = snapshot; console.log( `[Snapshot] Orders fetched: ${items.length}, isSynced: ${isSynced}` ); })
额外现象
移除createdAt.between过滤器后,INSERT事件依旧无法触发观察者,但UPDATE事件可以触发,且触发时不会包含新插入的数据;刷新页面后能获取到所有数据,包括新创建的条目。
解决方案
问题根源是之前把过滤器的时间上限(end)设为了订阅创建时的当前时间,导致订阅后新创建的条目因为createdAt晚于这个时间上限,不满足过滤条件,所以不会触发观察者。
调整时间范围,把end设置为未来足够远的时间即可解决问题,当前生效的设置如下:
const start = moment().utc().subtract(7, "day").toISOString(); const end = moment().utc().add(30, "day").toISOString();
内容的提问来源于stack exchange,提问作者BigPun86
相关产品推荐
相关产品推荐

