今天的主題要來介紹 omit fields ,我們可能會有一個情況是,不希望 DB 的欄位被別人看到,我們希望只 return 需要用到的欄位就好,確保隱密的欄位不會被看到,常見的例子例如 user 的 password ,我們當然不希望當我們在拿 user list 的時候,同時也把所有 user 的 password 都暴露出來,這樣是非常可怕的事情,那為了阻止這種事情發生,我們就來學一下 prisma 如何去 omit fields 吧~
今天我們就拿 user 隱藏 password 來示範,以下是 User model~
model User {
id String @id @default(cuid())
name String
email String @unique
password String
}
那要使用 omit 這個功能,必須開啟 previewFeatures.omitApi 這個 feature 才能使用喔~
generator client {
provider = "prisma-client-js"
previewFeatures = ["omitApi"]
}
然後每次添加新的 previewFeatures 都要記得 generate previewFeatures才能生效
>npx prisma generate
在還沒 omit 之前當我們 query user 的時候就會按照 model 的欄位去 return 所有的 fields ,同時你也可以看到有哪些 fields type
const user = await prismaClient.user.findFirst()

{
id: 'cm1uuaqmo0000egova98vq5k6',
name: 'danny',
email: 'hiunji64@gmail.com',
password: 'fsdfgdfsgdfgfd'
}
那要 omit password 很簡單,我們只需要在 findFirst 加上 omit 就好
const user = await prismaClient.user.findFirst({
omit: {
password: true
}
})
然後很神奇的是,你 omit 完的 result 他的 type 也會自動幫你 omit 掉

然後 response 的結果就不會包含 password 了
{
id: 'cm1uuaqmo0000egova98vq5k6',
name: 'danny',
email: 'hiunji64@gmail.com'
}
但這時我們可能思考到一種情況,如果我們 get User 的地方越多,那我們是不是每次都要加上 omit 這個欄位,這部分 prisma 很貼心的提供 global omit 的方式,讓你一次就 omit ,你只需要在 PrismaClient 中告訴哪些 model 的哪些欄位要 omit
const prismaClient = new PrismaClient({
omit: {
user: {
password: true
}
}
})
如此就算我們在 local 沒有加上 omit ,response 也會 omit 掉 password
const user = await prismaClient.user.findFirst()
{
id: 'cm1uuaqmo0000egova98vq5k6',
name: 'danny',
email: 'hiunji64@gmail.com'
}
那假如我們定好 global omit 後,想要在特定的地方看到 user 的 password 的話只要加上 select 就可以了
const user = await prismaClient.user.findFirst({
select: {
id: true,
password: true
}
})
{ id: 'cm1uuaqmo0000egova98vq5k6', password: 'fsdfgdfsgdfgfd' }
或者另外一種方式把 omit 改成 false
const user = await prismaClient.user.findFirst({
omit: {
password: false
}
})
一樣都可以看到 password 這個欄位,就看你習慣什麼寫法~
{
id: 'cm1uuaqmo0000egova98vq5k6',
name: 'danny',
email: 'hiunji64@gmail.com',
password: 'fsdfgdfsgdfgfd'
}
以上就是今天提到的 global omit 跟 local omit 寫法,那至於什麼情況該用什麼 omit 這邊簡單比較一下兩著的差異與使用情況~
如果您擔心安全性或暴露敏感訊息,最好使用 global omit 。這樣可以確保新編寫的查詢不會無意中包含敏感資料。在大多數情況下,您應該優先選擇這種方法,一個很好的用例是始終省略使用者密碼
如果您更關注資料傳輸量和效能,可以考慮使用 local omit。這允許您在大多數查詢中繼續使用模型的所有字段,然後在資料傳輸量較大的情況下進行最佳化。
例如,如果您有一個表,其中每個列的資料都比較輕量,但有一列包含大量JSON或Blob數據,您可以輕鬆地排除該列,以避免每次請求都需要傳輸所有資料。
global omit 以確保安全性和隱私。local omit 以優化資料傳輸和效能。global omit ,但在特定情況下再次包含被省略的欄位。✅ 前端社群 :
https://lihi3.cc/kBe0Y