javascript - Prisma: cách loại bỏ các thuộc tính khỏi các kiểu được tạo ra
CHỈNH SỬA có một nguy hiểm tiềm ẩn khi ẩn các trường trong định nghĩa TS: các trường sẽ không thể truy cập được trong quá trình phát triển với intellisense, nhưng đối tượng đầy đủ với các trường "ẩn" có thể bị gửi nhầm trong một phản hồi, có khả năng tiết lộ dữ liệu nhạy cảm.
Tôi đang xây dựng ứng dụng của mình sử dụng Prisma để kết nối với cơ sở dữ liệu (ứng dụng Next.js). Tôi đang gặp một số vấn đề với các định nghĩa Typescript được tạo tự động.
Tôi đang theo dõi các tài liệu nhưng không thể hiểu cách chọn một tập con các trường từ Post. Trong ví dụ của họ:
import { Prisma } from '@prisma/client'
const userWithPosts = Prisma.validator<Prisma.UserArgs>()({
include: { posts: true }, // -> how can I exclude some fields from the Post type?
})
type UserWithPosts = Prisma.UserGetPayload<typeof userWithPosts>
Hãy tưởng tượng Post như sau (đơn giản hóa):
model Post {
id Int @id @default(autoincrement())
createdAt DateTime @default(now())
title String
published Boolean @default(false)
author User @relation(fields: [authorId], references: [id])
authorId Int
}
Tôi muốn loại trừ một số trường được tạo tự động khỏi kiểu Post, ví dụ như createdAt. Về cơ bản, kiểu của user.posts[0] sẽ có tất cả các trường ngoại trừ createdAt.
Một giải pháp có thể là:
const postData = Prisma.validator<Prisma.PostArgs>()({
select: { id: true, title: true, published: true, authorId: true }
})
type UserWithPosts = Omit<Prisma.UserGetPayload<typeof userWithPosts>, 'posts'> & {
posts: postData[]
}
Nhưng tôi hy vọng có thứ gì đó sạch sẽ hơn một chút. Có lựa chọn thay thế nào không?
Câu trả lời #1
Tôi đã tìm ra một giải pháp: thay vì sử dụng include, hãy sử dụng select với một select lồng nhau cho posts. Vấn đề là nó trở nên khá dài dòng và khó duy trì (mỗi khi một trường được thêm vào sơ đồ, nó cũng phải được thêm vào đây...)
const userWithPosts = Prisma.validator<Prisma.UserArgs>()({
select: {
email: true,
name: true,
posts: {
select: {
id: true,
title: true,
published: true,
authorId: true
}
}
}
})
