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

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() ,如下所示:"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);

关于javascript - 扩展 Joi 未实现自定义运算符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64476991/

相关文章:

java - 在 Spring 和 Angular 应用程序中更改 JSON 结构的位置和方式

javascript - 文件读取器在另一个函数之前解析

javascript - 在javascript中的for循环中维护http请求的顺序

javascript - 如何突出显示链接到已选菜单的元素

javascript - 如何在 nest.js 中将所有路由重定向到 index.html (Angular)?

node.js - 通过在服务器上重新运行玩家的操作来保护多层浏览器游戏的安全

node.js - 如何将 Blob 添加到 Typescript?

javascript - 以 Angular 延迟调用 keyup 事件

javascript - 无法将 JSON 结果传递回 View

javascript - 下拉 | Material 设计 |两个元素 |重叠