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

Extended Joi not implementing custom operators

我在使用自定义运算符扩展 joi class 时遇到问题。我想验证 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

但是它们使用的属性与 TS 定义文件中描述的不同,因此不起作用。

您想扩展 Joi.string() 基地。请记住,您无法验证 new mongodb.ObjectID(),因为它是 object 类型。您扩展了 Joi.string(),如果您的值是 string 类型,这将首先检查 。如果不是,它将停止验证。您只能验证如下所示的 new mongodb.ObjectID().toHexString()"5f91a1449b13e3010c5548a2".

此答案使用 joi 17.2.1 和 mongodb 3.6.2

import Joi from 'joi';
import * as mongodb from 'mongodb';

interface ExtendedStringSchema extends Joi.StringSchema {
    objectId(): this;
}

interface ExtendedJoi extends Joi.Root {
    string(): ExtendedStringSchema;
}

const stringObjectExtension: Joi.Extension = {
    type: 'string',
    base: Joi.string(),
    messages: {
        'string.objectId': '{{#label}} must be a valid mongo id'
    },
    rules: {
      objectId: {
        validate: (value: any, helpers) => {
          if (!mongodb.ObjectId.isValid(value)) {
              return helpers.error('string.objectId')
          }

          return value;
        }
      }
    }
};

// create extended Joi
const JoiObj: ExtendedJoi = Joi.extend(stringObjectExtension);

// create new mongodb id
const id = new mongodb.ObjectID();

const objIdSchema = JoiObj.object({
    id: JoiObj.string().objectId()
});

// will fail because it won't pass the Joi.string() validation
const data1 = {
  id: id
};
console.log(objIdSchema.validate(data1).error);

// will succeed
const data2 = {
  id: id.toHexString()
};
console.log(objIdSchema.validate(data2).error);

我也遇到了这个问题。我用这个包解决了。

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

祝你好运:)