混合/对象类型的自定义猫鼬验证器

时间:2021-01-26 17:11:14

标签: node.js mongodb mongoose

我有一个 Mongoose 模型,它有一个字段(名为 clientConfig)类型为 Mixed/Object,以允许用户输入一个键值对象(这是我不能的设计要求改变)。自然会进行一些验证以防止用户发送任何内容:

  1. 不超过 X 个属性
  2. 属性名称不能超过 X 个字符
  3. 属性值必须是字符串
  4. 属性值不能超过 X 个字符

所有这些都是由:

const MySchema = new mongoose.Schema(
    {
       clientConfig: {
            type: Object,
            default: {},
            validate: [
                {
                    validator: (el) => Object.keys(el).length <= 10,
                    message: 'Too many keys'
                },
                {
                    validator: (el) => !Object.keys(el).find(key => key.length > 30),
                    message: 'At least one key is too long (30 chars max)'
                },
                {
                    validator: (el) => !Object.keys(el).find(key => typeof key != 'string'),
                    message: 'At least one key value is too long (30 chars max)'
                },
                {
                    validator: (el) => !Object.keys(el).find(key => el[key].length > 50),
                    message: 'At least one key value is too long (30 chars max)'
                }
            ]
        }
}

所有这些都有效。问题是出现错误时,Mongoose 上报的路径是顶级clientConfig: "The error message"。这就是为什么我选择的错误消息如此通用的原因:“至少有一个......”,因为我不能让猫鼬像这样clientConfig.foo: "The error message"显示到第二级。

我可以使用文档 (props) 中提到的消息字段中的函数对消息进行个性化处理,以获得类似 clientConfig: "The foo key name is too long!" 的内容,但问题是路径始终位于顶部级别,我的 API 客户端使用该路径来知道浏览器中显示错误消息的表单字段的名称,并且从技术上讲,字段 clientConfig 不存在,只有 clientConfig.foo 存在。

另一种解决方案可能是使 clientConfig 成为架构数组,在这种情况下,错误消息路径将包含受影响元素的索引,但数组将使一切变得难以管理,因为这些键也将用于查询/搜索,这涉及使用像 $elemMatch 这样的想法。

所以我想最后一个问题是我是否可以通过改变返回路径的方式来操作 Mongoose 错误。

0 个答案:

没有答案