如何在Joiful中实现MongoDB ObjectId验证?遇属性不存在报错求解
用Joiful验证MongoDB ObjectId的解决方案
你遇到的这个报错很典型——Joiful并没有内置专门针对MongoDB ObjectId的验证器方法,所以直接调用jf.ObjectId()会提示该属性不存在于Joiful的导出类型上。不过别担心,我们可以通过自定义验证逻辑来实现这个需求,下面是具体的步骤和代码示例:
实现方法:自定义ObjectId验证规则
我们可以利用Joiful提供的.custom()方法,结合MongoDB自带的ObjectId.isValid()工具函数,来创建一个自定义的ObjectId验证器:
修改后的完整代码
import * as jf from "joiful"; import { ObjectId } from 'mongodb'; // 创建自定义的ObjectId验证器 const validateObjectId = jf.custom((value: unknown) => { // 验证值是否为有效的ObjectId(支持字符串或ObjectId实例) if (!ObjectId.isValid(value as string)) { return '必须提供有效的MongoDB ObjectId'; } return true; }); class SignUp { @jf.string().required() username?: string; @jf .string() .required() .min(8) password?: string; @jf.date() dateOfBirth?: Date; @jf.boolean().required() subscribedToNewsletter?: boolean; // 使用自定义验证器替代不存在的jf.ObjectId() @validateObjectId.required() id?: ObjectId; } const signUp = new SignUp(); signUp.username = "rick.sanchez"; signUp.password = "wubbalubbadubdub"; signUp.id = new ObjectId(); // 或者传入有效的ObjectId字符串,比如"60d21b4667d0d8992e610c85" const { error } = jf.validate(signUp); if (error) { console.error('验证失败:', error.details); } else { console.log('所有字段验证通过'); }
额外的优化选项
如果你需要更严格的验证,比如要求id必须是MongoDB ObjectId的实例(而不仅仅是符合格式的字符串),可以修改自定义验证器的逻辑:
const validateObjectIdInstance = jf.custom((value: unknown) => { if (!(value instanceof ObjectId)) { return 'id必须是MongoDB ObjectId的实例'; } return true; });
这样就能根据你的具体需求,灵活实现ObjectId的验证了。
内容的提问来源于stack exchange,提问作者hari prasanth
相关产品推荐
相关产品推荐

