今天的主題要來介紹 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