Javascript 扩展Joi未实现自定义运算符
我在使用自定义运算符扩展joi类时遇到问题。我想验证mongodb ID,但扩展对象引发以下错误:Javascript 扩展Joi未实现自定义运算符,javascript,node.js,typescript,joi,Javascript,Node.js,Typescript,Joi,我在使用自定义运算符扩展joi类时遇到问题。我想验证mongodb ID,但扩展对象引发以下错误: error: uncaughtException: JoiObj.string(...).objectId is not a function TypeError: JoiObj.string(...).objectId is not a function 代码如下: import Joi from 'joi'; import * as mongodb from 'mongodb'; inte
error: uncaughtException: JoiObj.string(...).objectId is not a function
TypeError: JoiObj.string(...).objectId is not a function
代码如下:
import Joi from 'joi';
import * as mongodb from 'mongodb';
interface ExtendedStringSchema extends Joi.StringSchema {
objectId(): this;
}
interface ExtendedJoi extends Joi.Root {
string(): ExtendedStringSchema;
}
const JoiObj: ExtendedJoi = Joi.extend({
base: Joi.string(),
type: 'objectId',
messages: {
'objectId.invalid': '"{{#label}}" must be a valid mongo id'
},
validate(value, helpers) {
if (!mongodb.ObjectId.isValid(value)) {
return helpers.error('objectId.invalid');
}
return value;
}
});
const objIdSchema = JoiObj.object({
id: JoiObj.string().objectId()
});
我发现了两个例子:
但是,它们使用的属性与TS定义文件中描述的不同,因此不起作用。您希望扩展
Joi.string()
基。请记住,您无法验证新的mongodb.ObjectID()
,因为它属于对象的类型。您扩展了Joi.string()
,这将首先检查您的值是否为string
类型。如果不是,它将停止验证。您只能验证新的mongodb.ObjectID().toHexString()
,它看起来像:“5f91a1449b13e3010c5548a2”
这个答案使用的是joi
17.2.1和mongodb
3.6.2
从“Joi”导入Joi;
从“mongodb”导入*作为mongodb;
接口ExtendedStringSchema扩展了Joi.StringSchema{
objectId():这个;
}
接口ExtendedJoi扩展Joi.Root{
string():ExtendedStringSchema;
}
常量stringObjectExtension:Joi.Extension={
键入:“字符串”,
base:Joi.string(),
信息:{
'string.objectId':'{{{#label}}必须是有效的mongo id'
},
规则:{
目标:{
验证:(值:any,helpers)=>{
如果(!mongodb.ObjectId.isValid(值)){
返回helpers.error('string.objectId')
}
返回值;
}
}
}
};
//创建扩展托梁
const JoiObj:ExtendedJoi=Joi.extend(stringObjectExtension);
//创建新的mongodb id
const id=new mongodb.ObjectID();
const objIdSchema=JoiObj.object({
id:JoiObj.string().objectId()
});
//将失败,因为它无法通过Joi.string()验证
常量数据1={
id:id
};
log(objIdSchema.validate(data1.error);
//会成功的
常数数据2={
id:id.toHexString()
};
log(objIdSchema.validate(data2.error);
我也有这个问题。我用这个包裹解决了
祝您好运:)您使用的是哪个
joi
和mongodb
版本?非常感谢a1300,我也缺少了规则部分,尽管我把它弄乱了一点,但结构也不正确。这是完美的。非常感谢。扩展解决方案时,可以在stringObjectExtension
object中传递prepare:(val)=>({value:val.toHexString?val.toHexString():val})
。它将在验证之前处理转换,而不是在数据中手动转换。
const Joi = require('joi-oid')
const schema = Joi.object({
id: Joi.objectId(),
name: Joi.string(),
age: Joi.number().min(18),
})