typescript - როგორ გამოვიყენოთ zod Prisma-თან ერთად მომხმარებლის შეყვანის ვალიდაციისთვის
ვცდილობ Zod-სა და Prisma-ს ერთად გამოყენებას და შევხვდი რამდენიმე პრობლემას ვალიდაციასთან დაკავშირებით
ჩემი user.model.ts ფაილში მე მაქვს ეს ვალიდაციები Zod-ის გამოყენებით
//user.mode.ts file
const userSchema = z.object({
username: z.string({
required_error: "Username field is required",
}),
email: z
.string({
required_error: "Email field is required",
invalid_type_error: "This field must be in email format",
})
.email(),
password: z
.string({
required_error: "Password field is required",
})
.min(6, "Password must be at least 6 characters"),
});
export type UserModel = z.infer<typeof userSchema>;
და ჩემს user.service.ts ფაილში მაქვს ერთი ფუნქცია, რომელიც სურს გამოიყენოს ვალიდაცია user.model.ts-ში, არ ვიცი, ეს არის თუ არა მისი გამოყენების გზა
//user.service.ts file
export const createUser = async (
username: string,
email: string,
password: string
) => {
const user: UserModel = await prisma.user.create({
data: {
username: username,
email: email,
password: password,
},
});
return user;
};
და ასე გამოიყურება authController.ts-ში
//authController.ts file
export const signUpLogic = async (req: Request, res: Response) => {
const { username, email, password } = req.body;
try {
const hashedPassword = await bcrypt.hash(password, 10);
//
createUser(username, email, String(hashedPassword));
//
} catch (err) {
if (err instanceof PrismaClientKnownRequestError) {
if (err.code === "P2002") {
res.json({ message: "email already taken" });
}
}
}
};
მაგრამ როცა ვაშენებ კოდს ვალიდაციების შესამოწმებლად, ტერმინალი წარმოშობს პრიზმის შეცდომას, რომელიც უნდა დამუშავებულიყო catch ბლოკში, ნაცვლად იმისა, რომ შეცდომის შეტყობინება გამოჩნდეს პოსტმანში.
და ვალიდაციები არ მუშაობს. მე ჯერ ისევ შემიძლია შეიყვანო ბრალთამოუფრენი ელფოსტის ფორმატი ელფოსტის ველში
პასუხი #1
თქვენ ივიწყებთ await-ის გამოყენებას signUpLogic-ის შიგნით.
და ვალიდაციები არ მუშაობს. მე მაინც შემიძლია შევიყვანო ბროემის ელფოსტის ფორმატი ელფოსტის ველში.
თქვენ არ იყენებთ zod-ს მონაცემების დასამუშავებლად.
თქვენ შეგიძლიათ შემდეგი გააკეთოთ:
export const createUser = async ({
username,
email,
password,
}: UserModel) => {
const user: UserModel = await prisma.user.create({
data: {
username,
email,
password,
},
});
return user;
};
export const signUpLogic = async (req: Request, res: Response) => {
const { username, email, password } = req.body;
try {
const hashedPassword = await bcrypt.hash(password, 10);
const result = userSchema.safeParse({ username, email, password: String(hashedPassword)});
if(result.success) {
await createUser(result.data);
} else {
// handle wrong parsing result
}
} catch (err) {
if (err instanceof PrismaClientKnownRequestError) {
if (err.code === "P2002") {
res.json({ message: "email already taken" });
}
}
}
};
