iT邦幫忙

2023 iThome 鐵人賽

DAY 20
0
自我挑戰組

模仿知名網站的外觀系列 第 20

【Day20】模仿知名網站的外觀 X(7) Prisma連接MongoDB資料庫

  • 分享至 

  • xImage
  •  

打開MongoDB Atlas,我們來到Project的Overview點擊【CONNECT】,在新出現的視窗選擇【MongoDB for VS Code】,找到第三步【mongodb+】開頭的區塊複製起來,記得把替換成Create User時的密碼。

我們來到.env檔案進行修改,username和password和伺服器網址請根據自己的設定做修改。

DATABASE_URL="mongodb+srv://username:password@cluster0.fzdzygu.mongodb.net/x"

我們先進行測試,看一下我們能不能把prisma設定的內容傳到MongoDB Atlas,修改schema.prisma。

// This is your Prisma schema file,
// learn more about it in the docs: https://pris.ly/d/prisma-schema

generator client {
  provider = "prisma-client-js"
}

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

model Test {
  id    String  @id @default(auto()) @map("_id") @db.ObjectId
  email String  @unique
  name  String?
}

在終端機輸入:

npx prisma db push

成功的情況下不會出現紅字,可以刪除用來測試的Test資料。

接下來我們開始建立資料模型,首先從User開始。

model User {
  id String @id @default(auto()) @map("_id") @db.ObjectId
  name String?
  username String? @unique
  bio String?
  email String? @unique
  bannerImage String?
  avatarImage String?
  hashedPassword String?
  createdAt DateTime @default(now())
  updatedAt DateTime @updatedAt
  followingIds String[] @db.ObjectId
  hasNotification Boolean?

  posts Post[]
  comments Comment[]
  notifications Notification[]
}

這段程式定義了名為User的prisma模型如何對應到MongoDB的資料欄位。

舉例來說:name String?代表建立一個名字是name的欄位,資料形態可能是String或null或undefined。

我們介紹一下這些欄位的作用。

id:這是User的ID

name:User的姓名

username:用戶名

bio:X個人檔案的自我介紹

email:User的電子信箱

bannerImage:儲存X個人檔案的橫幅圖片

avatarImage:儲存X大頭照的圖片

hashedPassword:加密後的密碼,不使用明文儲存,即使駭客入侵資料庫也不能得到真正的密碼。

createdAt:User創建帳號的時間

updatedAt:User修改資料的時間

followingIds:X追隨的用戶列表

hasNotification:是否有通知

posts:對應到Post的prisma模型,用戶發佈的文章

comments:對應到Comment的prisma模型,用戶發佈的評論

notifications:對應到Notification的prisma模型,用戶的通知

@開頭都是MongoDB相關的設定

@id:將這個欄位設定成主鍵

@default((auto()):預設值為資料庫自動產生的數值

@map("_id"):這個欄位會對應到MongoDB中的_id欄位

@db.ObjectId:告訴MongoDB將這個欄位的資料形態設定成ObjectId

@unique:這個欄位裏的值不能重複

@default(now()):預設值為當下的時間

@updatedAt:每次更新時自動更新時間

Post的資料模型

model Post {
  id String @id @default(auto()) @map("_id") @db.ObjectId
  content String
  createdAt DateTime @default(now())
  updatedAt DateTime @updatedAt
  userId String @db.ObjectId
  likedIds String[] @db.ObjectId

  user User @relation(fields: [userId], references: [id], onDelete: Cascade)

  comments Comment[]
}

content:文章的內容

createdAt:文章發表的時間

updatedAt:文章修改的時間

userId:文章作者的id

likesIds:按下喜歡的用戶id

user:定義作者與文章之間的一對多關聯,userId為外鍵對應到User的id欄位,當user被刪除時發表的post也會被刪除。

comments:文章下的評論

Comment的資料模型

model Comment {
  id String @id @default(auto()) @map("_id") @db.ObjectId
  content String
  createdAt DateTime @default(now())
  updatedAt DateTime @updatedAt
  userId String @db.ObjectId
  postId String @db.ObjectId

  user User @relation(fields: [userId], references: [id], onDelete: Cascade)
  post Post @relation(fields: [postId], references: [id], onDelete: Cascade)
}

Notification的資料模型

model Notification {
  id String @id @default(auto()) @map("_id") @db.ObjectId
  content String
  userId String @db.ObjectId
  createdAt DateTime @default(now())

  user User @relation(fields: [userId], references: [id], onDelete: Cascade)
}

完成以上程式碼後,在終端機輸入:

npx prisma db push

登入MongoDB,在畫面上找到【Browse Collections】,可以看到Comment、Notification、Post、User已經建立好了。


上一篇
【Day19】模仿知名網站的外觀 X(6) 顯示登錄視窗與後端設定
下一篇
【Day21】模仿知名網站的外觀 X(8) 完成註冊功能
系列文
模仿知名網站的外觀30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言