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

Prisma Schema(MongoDB)自定义类型无法正常使用问题排查

Prisma 使用自定义嵌入式类型时的错误排查

问题场景

原本可正常运行的Prisma Schema,在使用自定义类型loginStats创建用户时失败,抛出以下错误:

Unknown arg `set` in data.loginInfo.set for type loginStatsCreateInput. Did you mean `select`?
Argument lastLogin for data.loginInfo.lastLogin is missing.

原Schema代码

generator client {
  provider      = "prisma-client-js"
  binaryTargets = ["native", "rhel-openssl-1.0.x"]
}

datasource db {
  provider = "mongodb"
  url      = env("DATABASE_URL")
}

model User {
  id         String     @id @default(auto()) @map("_id") @db.ObjectId
  email      String     @unique
  given_name String
  last_name  String
  loginInfo  loginStats
  role       Role       @default(User)
  Articles   Article[]
}

model Article {
  id        String   @id @default(auto()) @map("_id") @db.ObjectId
  createdAt DateTime @default(now())
  updatedAt DateTime @updatedAt
  published Boolean  @default(false)
  title     String
  author    User?    @relation(fields: [authorId], references: [id])
  authorId  String?  @db.ObjectId
}

type loginStats {
  createdAt DateTime @default(now())
  lastLogin DateTime
}

enum Role {
  User
  Admin
}

原测试函数代码

import { Request, Response } from "express";
import cognitoUserPoolHelper from "../authLogin";
import { PrismaClient } from "@prisma/client";

const prisma = new PrismaClient();

export const test = async (req: Request, res: Response) => {
    if (!prisma) {
        console.log(req);
    }
    const user = await prisma.user.create({
        data: {
            email: "randoms@example.com",
            given_name: "Test",
            last_name: "Test",
            loginInfo: {
                set: {
                    createdAt: Date.now().toString(),
                    lastLogin: Date.now().toString(),
                },
            },
        },
    });
    console.log(user);

    res.json({
        msg: "Hello World",
    });
};

错误原因

  • 错误1:误用set关键字
    Prisma中,set是用于更新操作时替换整个嵌入式对象的语法,而创建用户时,嵌入式类型(type定义的子文档)直接传入对象结构即可,不需要包裹set。
  • 错误2:DateTime类型值格式错误
    Schema中loginStats的字段为DateTime类型,要求传入Date对象或ISO 8601格式的字符串,但代码中使用Date.now().toString()返回的是时间戳字符串,不符合类型要求,导致Prisma无法识别有效值,进而误判为字段缺失。

解决方案

步骤1:(可选)调整Schema字段可选性

如果希望创建用户时可以暂不传入lastLogin(后续再更新),可以给loginStats的lastLogin添加可选标记:

type loginStats {
  createdAt DateTime @default(now())
  lastLogin DateTime? # 添加?标记为可选字段
}

步骤2:修正测试函数代码

去掉多余的set关键字,传入符合DateTime要求的格式值:

import { Request, Response } from "express";
import cognitoUserPoolHelper from "../authLogin";
import { PrismaClient } from "@prisma/client";

const prisma = new PrismaClient();

export const test = async (req: Request, res: Response) => {
    const user = await prisma.user.create({
        data: {
            email: "randoms@example.com",
            given_name: "Test",
            last_name: "Test",
            loginInfo: {
                // 直接传入嵌入式对象,无需set
                createdAt: new Date(), // 使用Date对象
                lastLogin: new Date()  // 或使用ISO字符串:new Date().toISOString()
            },
        },
    });
    console.log(user);

    res.json({
        msg: "Hello World",
    });
};

步骤3:重新生成Prisma Client

修改Schema后,记得重新生成Client:

npx prisma generate

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.30 04:55:17