如何递归转换null为undefined,适配GraphQL Nexus对接Prisma的参数要求
Prisma ORM对接GraphQL Nexus参数类型适配方案
适配逻辑说明
Prisma仅支持
T | undefined类型的可选入参,而GraphQL返回的参数可能存在T | null | undefined三种状态,核心适配思路是将所有null值统一转换为undefined,即可满足类型兼容要求。
1. 实现核心转换工具
以下是可直接使用的转换代码:
/** * 转换单个null值为undefined */ export function nullToUndefined<T>(value: T | null | undefined): T | undefined { return value === null ? undefined : value } /** * 递归处理嵌套对象内所有null值,统一转换为undefined * 适用于多层结构的GraphQL输入参数 */ export function deepNullToUndefined<T extends Record<string, any>>( value: T | null | undefined ): T | undefined { if (value === null || value === undefined) return undefined if (typeof value !== 'object') return value const result: Record<string, any> = Array.isArray(value) ? [] : {} for (const [key, val] of Object.entries(value)) { result[key] = typeof val === 'object' && val !== null ? deepNullToUndefined(val) : nullToUndefined(val) } return result as T }
2. 业务场景使用方式
- 单参数转换场景:适用于简单查询场景
resolve(_, args) { return prisma.user.findFirst({ where: { id: nullToUndefined(args.userId), phone: nullToUndefined(args.phone) } }) }
- 嵌套参数转换场景:适用于更新类的复杂入参
resolve(_, args) { const processedUpdateData = deepNullToUndefined(args.updateData) return prisma.user.update({ where: { id: args.userId }, data: processedUpdateData }) }
3. 全局自动转换(可选优化)
可以通过Nexus插件实现所有Resolver参数自动转换,无需手动调用工具函数:
import { plugin, makeSchema } from 'nexus' const autoConvertNullPlugin = plugin({ name: 'AutoConvertNullPlugin', onCreateFieldResolver() { return (root, args, ctx, info, next) => { const processedArgs = deepNullToUndefined(args) return next(root, processedArgs, ctx, info) } } }) // 注册插件到Nexus schema export const schema = makeSchema({ types: [/** 你的所有Nexus类型 */], plugins: [autoConvertNullPlugin] })
内容的提问来源于stack exchange,提问作者Nenad
相关产品推荐
相关产品推荐

