You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何递归转换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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.13 15:30:00