node.js - Mongoose 中的动态验证

标签 node.js mongoose

我有模型,其中汽车属性是可选的,但是汽车嵌套文档中有一些属性,如果用户有汽车,则应该需要这些属性,例如 cartype : {required: true},但是当汽车已定义。

 var UserSchema = new Schema({
        email: {
            type: 'String',
            required: true
        },
        car: {
            carType: {
               // should be required if user have car
               type: 'Number',
               default: TransportType.Car
            },
        }
    })

最佳答案

如果carType没有default值,我们可以定义一个函数hasCarrequired of carType如下

var UserSchema = new Schema({
    email: {
        type: 'String',
        required: true
    },
    car: { 
        carType: {
           type: 'Number',
           required: hasCar,
           //default: TransportType.Car
        },
    }
});

function hasCar() {
    return JSON.stringify(this.car) !== JSON.stringify({});//this.car; && Object.keys(this.car).length > 0;
}

带有测试代码

var u1 = new UUU({
    email: 'test.user1@email.com'
});

u1.save(function(err) {
    if (err)
        console.log(err);
    else
        console.log('save u1 successfully');
});

var u2 = new UUU({
    email: 'test.user1@email.com',
    car: {carType: 23}
});

u2.save(function(err) {
    if (err)
        console.log(err);
    else
        console.log('save u2 successfully');
});

结果:

{ "_id" : ObjectId("56db9d21d3fb99340bcd113c"), "email" : "test.user1@email.com", "__v" : 0 }
{ "_id" : ObjectId("56db9d21d3fb99340bcd113d"), "email" : "test.user1@email.com", "car" : { "carType" : 23 }, "__v" : 0 }
<小时/>

但是,如果carType默认值,这里可能有一个解决方法

var UserSchema = new Schema({
    email: {
        type: 'String',
        required: true
    },
    car: { 
        carType: {
           type: 'Number',
           required: hasCar,
           default: 1
        },
    }
});

function hasCar() {
    if (JSON.stringify(this.car) === JSON.stringify({carType: 1})) {
        this.car = {};
    }
    return JSON.stringify(this.car) === JSON.stringify({});
}

UserSchema.pre('save', function(next){
    // if there is only default value of car, just remove this default carType from car 
    if (JSON.stringify(this.car) === JSON.stringify({carType: 1})) {
        delete this.car;
    }
    next();
});

通过上述测试代码,结果为

{ "_id" : ObjectId("56db9f73df8599420b7d258a"), "email" : "test.user1@email.com", "car" : null, "__v" : 0 }
{ "_id" : ObjectId("56db9f73df8599420b7d258b"), "email" : "test.user1@email.com", "car" : { "carType" : 23 }, "__v" : 0 }

关于node.js - Mongoose 中的动态验证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35820167/

相关文章:

javascript - Next.js API 端点调用中返回空对象的 fetch 正文

javascript - node.js:如何在 forEach 循环中使用异步调用实现路由方法?

javascript - 使用 Fiddler 生成带正文的 POST 请求

javascript - 如何使用 Mongoose 查询 2 个字段中的关键字

node.js - mongodb 聚合 $sum 返回额外的 float 字

node.js - Mongoose 可选的搜索查询参数?

node.js - 如何在 node.js 中的异步和条件循环中执行嵌套查询

Javascript Promise 和 Firebase

mongodb - 如何仅查看 Mongoose 中值的首字母来查找所有文档

javascript - 如何提高这个 MongoDB/Mongoose 查询的性能?