在mongoose中,我如何要求String字段不为null或未定义(允许0长度字符串)?

时间:2017-06-02 04:22:49

标签: mongoose mongoose-schema

我试过这个,允许nullundefined,并完全省略要保存的密钥:

{
  myField: {
    type: String,
    validate: value => typeof value === 'string',
  },
}

这个,不允许保存''(空字符串):

{
  myField: {
    type: String,
    required: true,
  },
}

如何在不禁用空字符串的情况下强制执行某个字段为String并且在Mongoose中同时显示nullundefined

4 个答案:

答案 0 :(得分:3)

通过使必填字段成为条件,可以实现:

const mongoose = require('mongoose');

var userSchema = new mongoose.Schema({
    myField: {
        type: String,
        required: isMyFieldRequired,
    }
});

function isMyFieldRequired () {
    return typeof this.myField === 'string'? false : true
}

var User = mongoose.model('user', userSchema);

这样,new User({})new User({myField: null})会抛出错误。但空字符串将起作用:

var user = new User({
    myField: ''
});

user.save(function(err, u){
    if(err){
        console.log(err)
    }
    else{
        console.log(u) //doc saved! { __v: 0, myField: '', _id: 5931c8fa57ff1f177b9dc23f }
    }
})

答案 1 :(得分:1)

只需编写一次,它将应用于所有架构

mongoose.Schema.Types.String.checkRequired(v => typeof v === 'string');

请参见 official mongoose documentationgithub issue

中的此方法

答案 2 :(得分:0)

您现在可以在字符串上使用“匹配”属性。 match 属性采用正则表达式。所以你可以使用这样的东西:

myfield: {type: String, required: true, match: /^(?!\s*$).+/}

字符串架构的文档,包括匹配:https://mongoosejs.com/docs/api.html#schemastringoptions_SchemaStringOptions-match

答案 3 :(得分:-1)

验证将像

一样
name: {
    type: String,
    validate: {
        validator: function (v) {
            return /^[a-zA-Z]+$/.test(v);
        },
        message: '{PATH} must have letters only!'
    },
},

在模型中试试