最初创建空数组作为 prisma 中的字段不起作用

问题描述 投票:0回答:1

我正在使用 React Typescript Next 和 prisma 做项目,我正在尝试使用最初为空的数组作为播放列表字段创建用户,我没有收到任何错误,但是当我刷新数据库(mongodb)时,我在新创建的用户上看不到播放列表属性。首先我认为如果它是空的我就看不到它,但是当我想调用它并更新这个字段时,我意识到这是不可能的。

我的 schema.prisma 文件:

model User {
  id             String   @id @default(auto()) @map("_id") @db.ObjectId
  name           String
  email          String   @unique
  emailVerified  DateTime
  image          String?
  hashedPassword String
  createdAt      DateTime @default(now())
  updatedAt      DateTime @updatedAt
  playlists      Playlist[]
  recentSearches Json[]
  liked          Json
}

model Playlist {
  id       String  @id @default(auto()) @map("_id") @db.ObjectId
  name     String
  tracks   Json[]
  image    String?
  isPublic Boolean @default(true)
  author   String?
  User     User    @relation(fields: [userId], references: [id])
  userId   String  @db.ObjectId
}

我的注册用户逻辑:

export default async function handler(
  req: NextApiRequest,
  res: NextApiResponse
) {
  if (req.method !== "POST") {
    return res.status(405).end();
  }
  try {
    const { email, name, password } = req.body;
    const existingUser = await prismadb.user.findUnique({ where: { email } });
    if (existingUser) {
      return res
        .status(422)
        .json({ error: "Email is already taken", cause: "email" });
    }

    const hashedPassword = await bcrypt.hash(password, 12);
    const user = await prismadb.user.create({
      data: {
        email,
        name,
        hashedPassword,
        image: "",
        emailVerified: new Date(),
        recentSearches: [],
        liked: {},
        playlists: { create: [] },
      },
    });

    return res.status(200).json(user);
  } catch (error) {
    console.log(error);
    return res.status(400).json(error);
  }
}

我尝试使用 create 和 createMany 属性但没有任何效果,我意识到如果我使用 Json[] 而不是 Playlist[] 它可以工作,但我希望将 Playlists[] 作为一种类型。 我希望在数据库中创建一个具有空播放列表字段数组的用户。

reactjs typescript schema prisma next
1个回答
0
投票

在 MongoDB 中,最初为空或未显式设置的字段的行为与传统 SQL 数据库不同。在 MongoDB 中,文档中未设置的字段不会存储在数据库中。这与 SQL 数据库不同,在 SQL 数据库中,所有列都存在于每一行中,并且显式表示空字段。

在 Prisma 架构中,

playlists
字段默认定义为空数组:

playlists      Playlist[]

当您使用 Prisma 和 MongoDB 创建新用户时,如果

playlists
字段为空,则不会将其存储在数据库中,因为 MongoDB 默认不存储空数组的字段。

如果您想确保

playlists
字段始终存在于用户文档中,即使它最初为空,您也可以修改架构以明确为该字段设置默认值:

playlists      Playlist[] @default([])

进行此更改后,您可能需要重新生成 Prisma 客户端以应用更新后的架构:

npx prisma generate
© www.soinside.com 2019 - 2024. All rights reserved.