Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/394.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 扩展Joi未实现自定义运算符_Javascript_Node.js_Typescript_Joi - Fatal编程技术网

Javascript 扩展Joi未实现自定义运算符

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

我在使用自定义运算符扩展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';

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),
})