扩展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';

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

祝你好运:)