如何定义GraphQL自定义查询解决Amplify DynamoDB缺失系统字段报错
解决方法
1. 编写自定义查询语句
Amplify自动生成的默认查询会携带所有系统字段,你只需要手动编写查询,仅请求你需要的业务字段即可绕开非空校验错误,示例如下:
query ListDatabaseConversionsWithoutSystemFields( $filter: ModelDatabaseConversionFilterInput $limit: Int $nextToken: String ) { listDatabaseConversions( filter: $filter limit: $limit nextToken: $nextToken ) { items { # 仅保留业务需要的字段,不要添加_version、_deleted、_lastChangedAt id userID ConversionID createdAt updatedAt } nextToken startedAt } }
这个查询直接复用Amplify自动生成的listDatabaseConversions查询能力,不需要额外修改后端schema配置。
2. 调用自定义查询拿取数据
你可以用Amplify的API.graphql方法直接调用上述自定义查询,不会触发字段非空报错:
import { API } from 'aws-amplify'; const listQuery = /* GraphQL */ ` query ListDatabaseConversionsWithoutSystemFields( $filter: ModelDatabaseConversionFilterInput $limit: Int $nextToken: String ) { listDatabaseConversions( filter: $filter limit: $limit nextToken: $nextToken ) { items { id userID ConversionID createdAt updatedAt } nextToken startedAt } } `; const getConversions = async () => { const result = await API.graphql({ query: listQuery, variables: { limit: 1000 } }); return result.data.listDatabaseConversions.items; }
3. 异常记录修复逻辑
拿到所有记录后,你只需要将记录原样保存一次,Amplify后端会自动补全缺失的三个系统字段,示例修复逻辑:
import { DataStore } from 'aws-amplify'; import { DatabaseConversion } from './models'; const fixInvalidRecords = async () => { const records = await getConversions(); for (const record of records) { // 原样保存,触发后端自动补全系统字段 await DataStore.save(DatabaseConversion.copyOf(record, () => {})); } }
你可以将这个修复逻辑放在新版本应用的启动阶段执行,同时可以设置定时执行逻辑,处理旧版本客户端持续生成的异常记录。
内容的提问来源于stack exchange,提问作者Gabriel
相关产品推荐
相关产品推荐

