reactjs - Crearea unui array gol inițial ca un câmp în prisma nu funcționează
Lucrez la un proiect cu React, TypeScript, Next și Prisma, încerc să creez un utilizator cu câmpul playlists inițial gol, nu primesc nici o eroare, dar când reîmprospătez baza mea de date (MongoDB) nu pot vedea proprietatea playlists la utilizatorul creat recent. La început am crezut că dacă este golă pur și simplu nu o pot vedea, dar apoi, când am vrut să o invoce și să actualizez acest câmp, mi-am dat seama că nu este posibil.
Fișierul meu 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
}
Logica mea de înregistrare a utilizatorului:
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);
}
}
Am încercat să folosesc atributele create și createMany, dar nimic nu a funcționat. Mi-am dat seama că dacă folosesc Json[] în loc de Playlist[] funcționează, dar vreau să am Playlists[] ca tip. Mă aștept să creez un utilizator cu un câmp playlists gol în baza de date.
Modul în care vreau să actualizez câmpul playlisturilor mele
const createdPlaylist = await prismadb.playlist.create({
data: { name: playlistName, tracks: [], userId: user.id },
});
const result = await prismadb.user.update({
where: { id: user.id },
data: { playlists: { connect: { id: createdPlaylist.id } } },
});
Răspuns #1
În MongoDB, comportamentul pentru câmpurile care sunt inițial goale sau nu sunt setate explicit este diferit față de bazele de date SQL tradiționale. În MongoDB, câmpurile care nu sunt setate într-un document nu sunt stocate în baza de date. Acest lucru este diferit de bazele de date SQL, unde toate coloanele sunt prezente în fiecare rând, iar câmpurile goale sunt reprezentate în mod explicit.
În schema ta Prisma, câmpul playlists este definit implicit ca un array gol:
playlists Playlist[]
Când creezi un utilizator nou folosind Prisma și MongoDB, câmpul playlists nu va fi stocat în baza de date dacă este gol, deoarece MongoDB nu stochează câmpurile cu array-uri goale în mod implicit.
Dacă doriți să vă asigurați că câmpul playlists este întotdeauna prezent în documentul utilizatorului, chiar dacă inițial este gol, puteți modifica schema pentru a seta explicit o valoare implicită pentru acel câmp:
playlists Playlist[] @default([])
După ce faceți această modificare, este posibil să trebuiască să regenerați clientul Prisma pentru a aplica schema actualizată:
npx prisma generate
Răspunsul #2
Am rezolvat această problemă, totul funcționa conform așteptărilor, dar am uitat să scriu {include: {playlists: true}} pe obiect în metoda find, așa că nu am văzut playlisturile în consolă.
