我已经使用 JOI 实现了此代码,其中用户必须发送 userId 和正文中的至少一个键。如何使用 ZOD 实现相同的功能?
params: Joi.object().keys({
userId: Joi.required().custom(objectId),
}),
body: Joi.object()
.keys({
name: Joi.string(),
email: Joi.string().email(),
password: Joi.string().custom(password),
})
.min(1),
};
我认为没有直接的模拟zod
但你可以使用来实现这个约束refine or superRefine
使用优化您的架构可能如下所示:
const schema = z.object({
params: z.object({
userId: z.string()
}),
body: z
.object({
name: z.string(),
email: z.string().email(),
password: z.string()
})
.partial()
.refine(
({ name, email, password }) =>
name !== undefined || email !== undefined || password !== undefined,
{ message: "One of the fields must be defined" }
)
});
如果精炼失败那么你会得到一个ZodError
并指定消息。
可以在任意部分对象上重用的更通用的优化函数如下所示:
const atLeastOneDefined = (obj: Record<string | number | symbol, unknown>) =>
Object.values(obj).some(v => v !== undefined);
我注意到对象 ID 和密码有自定义解析。我认为这些都可以完成refine
但我不熟悉 Joi 自定义验证器的工作原理,所以我不想用细化来编写它们并让它成为不正确的代码。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)