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

Next.js+Prisma创建用户报错:未找到简写属性的作用域值

解决"No value exists in scope for the shorthand property 'firstName'"报错

问题根源

你在prisma.user.create的data参数中使用了对象简写语法(如firstName),但这些变量在当前函数作用域内并未定义——你没有从传入的FormData对象中提取对应字段的值。此外代码还存在字段拼写错误和类型不匹配的问题,需要一并修正。

解决方案步骤及修正后代码

  1. 从FormData提取字段值:通过FormData.get()方法获取每个表单字段的值
  2. 修正拼写错误:将streetAdddress改为与Prisma Schema一致的streetAddress
  3. 类型转换:将FormData返回的字符串值转换为Prisma模型要求的类型(如Int转数字、DateTime转Date对象)

修正后的createUser函数:

export async function createUser(user: FormData) {
  const prisma = new PrismaClient()

  // 提取并转换FormData中的字段
  const firstName = user.get('firstName') as string
  const lastName = user.get('lastName') as string
  const middleName = user.get('middleName') as string | null
  const email = user.get('email') as string
  const dateOfBirth = new Date(user.get('dateOfBirth') as string)
  const mobileNumber = user.get('mobileNumber') as string
  const idType = user.get('idType') as string
  const idNumber = user.get('idNumber') as string
  const idExpirtyDate = new Date(user.get('idExpirtyDate') as string)
  const idIssueState = new Date(user.get('idIssueState') as string)
  const streetAddress = user.get('streetAddress') as string
  const suburb = user.get('suburb') as string
  const postCode = parseInt(user.get('postCode') as string, 10)
  const state = user.get('state') as string
  const bsb = parseInt(user.get('bsb') as string, 10)
  const accountNumber = parseInt(user.get('accountNumber') as string, 10)
  const payIdType = user.get('payIdType') as string
  const payId = user.get('payId') as string

  await prisma.user.create({
    data: {
      firstName,
      lastName,
      middleName,
      email,
      dateOfBirth,
      mobileNumber,
      idType,
      idNumber,
      idExpirtyDate,
      idIssueState,
      streetAddress,
      suburb,
      postCode,
      state,
      bsb,
      accountNumber,
      payIdType,
      payId,
    },
  })
}

额外优化建议

  • 添加空值校验:如果表单字段为必填项,建议在转换前检查是否为空,避免运行时错误:
    const postCodeStr = user.get('postCode')
    if (!postCodeStr) throw new Error('邮政编码为必填项')
    const postCode = parseInt(postCodeStr, 10)
    
  • 定义表单类型:创建TypeScript接口约束表单字段,提升代码可读性和类型安全性:
    interface UserFormFields {
      firstName: string
      lastName: string
      middleName?: string
      email: string
      dateOfBirth: string
      // 其他字段类型定义...
    }
    

内容的提问来源于stack exchange,提问作者Nadun Perera

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.20 22:43:13