问题描述
我在使用自定义运算符扩展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()
});
我发现了2个例子:
https://github.com/sideway/joi/issues/2357
How to extend a module from npm using TypeScript?
但是它们使用的属性与TS定义文件中描述的属性不同,因此不起作用。
解决方法
您想扩展Joi.string()
基数。请记住,您无法验证new mongodb.ObjectID()
,因为它的类型为object
。您扩展了Joi.string()
,如果您的值是string
类型,则会先检查首先。如果不是,它将停止验证。您只能验证看起来像new mongodb.ObjectID().toHexString()
的{{1}}。
此答案使用的是"5f91a1449b13e3010c5548a2"
17.2.1和joi
3.6.2
mongodb
,
我也有这个问题。我用这个包裹解决了。
https://www.npmjs.com/package/joi-oid
const Joi = require('joi-oid')
const schema = Joi.object({
id: Joi.objectId(),name: Joi.string(),age: Joi.number().min(18),})
祝你好运:)