Apollo Server查询返回电影数据却报Movie.original_title非空字段不能为null错误
问题根因
这个报错是因为Apollo Server做类型校验时,发现Movie类型下标记为非空的original_title字段拿到了null值,和你控制台打印的数据库查询结果不一致,90%以上的情况是字段名命名不匹配或者存在额外的字段转换逻辑导致的。
排查&解决步骤
- 首先检查你的GraphQL Schema定义
确认Movie类型的original_title字段命名、非空标记和你返回的数据完全匹配,示例正确定义如下:
type Movie { id: ID! original_title: String! # 注意这里的字段名必须和你返回的对象属性名完全一致,不要写成驼峰originalTitle tmdb_id: Int! poster_path: String userId: Int! } type Query { moviesFromUser(userId: Int!): [Movie!]! }
如果你的Schema里该字段写的是驼峰格式originalTitle,就会导致Apollo从返回对象里拿不到对应属性,返回null触发报错。
- 检查是否存在全局字段名转换逻辑
很多项目会配置Prisma自动转换下划线字段为驼峰,或者加了Apollo全局中间件做字段名转换,你可以在Resolver返回前加日志验证返回对象的实际键名:
moviesFromUser: async (root, args) => { const movies = await prisma.movie.findMany({ where: {userId: args.userId}, }); // 加这两行验证返回的实际键名 console.log('返回对象的所有键:', Object.keys(movies[0])); console.log('original_title实际值:', movies.map(item => item.original_title)); return movies; },
如果日志打印的键名是originalTitle而非original_title,说明存在自动转换逻辑,两种修复方案:
- 方案一:把Schema里的字段、查询语句里的字段都改成驼峰格式,和转换后的命名对齐
- 方案二:关闭全局字段自动转换配置,保持和数据库字段一致的下划线命名
- 检查是否有单独的字段Resolver逻辑
如果你为Movie.original_title单独写了自定义Resolver,检查该Resolver的返回逻辑是否正确,比如是否错误地取了parent.originalTitle而非parent.original_title,导致返回null。
内容的提问来源于stack exchange,提问作者Peter Boomsma
相关产品推荐
相关产品推荐

