typescript 如何使用zod和Prisma验证用户输入

bnlyeluc  于 2022-12-14  发布在  TypeScript
关注(0)|答案(1)|浏览(207)

我尝试同时使用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" });
      }
    }
  }
};

但是当我运行代码测试验证时,终端抛出了一个prisma错误,该错误应该由catch块处理,而不是在postman中显示错误消息。
而且验证不起作用。我仍然可以在电子邮件字段中输入错误的电子邮件格式

u5i3ibmn

u5i3ibmn1#

您忘记在signUpLogic中使用await
而且验证也不起作用。我仍然可以在电子邮件字段中输入错误的电子邮件格式。
您没有使用zod来解析数据。
您可以执行以下操作:
第一个

相关问题