2016-08-13 2 views
0

Как я могу получить необязательный тип поля string с номером minlength. Документы (linked here) не вдаваться в подробности по этому вопросу? Я пытался:Mongoose дополнительный валидатор minlength?

var schema = mongoose.Schema({ 
    name: { type: String, required: true, maxlength: 255 }, 
    nickname: { type: String, minlength: 4, maxlength: 255 } 
}); 

Каждая вариация, которую я пытаюсь, возвращает некоторый тип ошибки.

Моя цель состоит в том, чтобы оценить minlength и maxlengthтолько если значения запитывались.

ответ

1

Короткого ответа: написать мангуст плагин.

Длинный ответ:

Вы можете добавить дополнительные атрибуты схемы, которые вы хотите. Вы вообще пишете плагин Mongoose , чтобы на самом деле что-то с ними сделать. Примером этого может быть в mongoose-hidden плагин, который позволяет определить некоторые из ваших полей, как скрытой во время преобразования:

var userSchema = new mongoose.Schema({ 
    name: String, 
    password: { type: String, hide: true } 
}); 
userSchema.plugin(require('mongoose-hidden')); 

var User = mongoose.model('User', userSchema, 'users'); 
var user = new User({ name: 'Val', password: 'pwd' }); 
// Prints `{ "name": "Val" }`. No password! 
console.log(JSON.stringify(user.toObject())); 

Обратите внимание на атрибут на password: поле hide: true. Плагин переопределяет функцию toObject(), и пользовательская версия удаляет ищет атрибут и удаляет это поле.

Вот тело плагина. Строка # 4 выглядит проверяет существование schemaType.options.hide атрибута:

function HidePlugin(schema) { 
    var toHide = []; 
    schema.eachPath(function(pathname, schemaType) { 
    if (schemaType.options && schemaType.options.hide) { 
     toHide.push(pathname); 
    }  
    }); 
    schema.options.toObject = schema.options.toObject || {}; 
    schema.options.toObject.transform = function(doc, ret) { 
    // Loop over all fields to hide 
    toHide.forEach(function(pathname) { 
     // Break the path up by dots to find the actual 
     // object to delete 
     var sp = pathname.split('.'); 
     var obj = ret; 
     for (var i = 0; i < sp.length - 1; ++i) { 
     if (!obj) { 
      return; 
     } 
     obj = obj[sp[i]]; 
     } 
     // Delete the actual field 
     delete obj[sp[sp.length - 1]]; 
    }); 

    return ret; 
    }; 
} 

Моя точка ...

... если вы пишете мангуста плагин (например, может быть «MinLengthPlugin»), вы можете повторно использовать это на всех своих схемах без написания дополнительного кода. В плагине вы могли переопределить функциональность что-то вроде:

module.exports = function MinLenghPlugin (schema, options) { 

    schema.pre('save', myCustomPreSaveHandler); 

    var myCustomPreSaveHandler = function() { 
     // your logic here 
    } 
}; 
1

Я не думаю, что вы можете сделать это с помощью встроенных валидаторов, но вы можете с помощью пользовательских один:

var optionalWithLength = function(minLength, maxLength) { 
    minLength = minLength || 0; 
    maxLength = maxLength || Infinity; 
    return { 
    validator : function(value) { 
     if (value === undefined) return true; 
     return value.length >= minLength && value.length <= maxLength; 
    }, 
    message : 'Optional field is shorter than the minimum allowed length (' + minLength + ') or larger than the maximum allowed length (' + maxLength + ')' 
    } 
} 

// Example usage: 
var schema = mongoose.Schema({ 
    name : { type: String, required: true, maxlength: 255 }, 
    nickname: { type: String, validate: optionalWithLength(4, 255) } 
}); 
0

Я столкнулся с тем же затруднительным хотел строку, которая является необязательным, уникальным минимальной длиной и проверками, поэтому я использовал несколько валидаторов, чтобы сделать трюк также используется «предварительно» сохранить метод, чтобы удалить пустые/нулевые значения, чтобы не дубликатов, так как пустые строки не являются уникальными

var validateUserNameLength = function (username) { 
    if (username && username.length !== '') { 
     return username.length >= 3; 
    } 
    return true; 
}; 

var validateUserNameFormat = function (username) { 
    if (username && username.length) { 
     return username !== 'foo; 
    } 
    return true; 
} 


var validateUserName= [ 
    { validator: validateUserNameLength , msg: 'short UserName' }, 
    { validator: validateUserNameFormat , msg: 'No Foo name' } 
]; 

var UserSchema= mongoose.Schema({ 
    userName: { 
     type: String, 
     lowercase: true, 
     trim: true, 
     index: { 
      unique: true, 
      sparse: true 
     }, 
     validate: validateUserName, 
     maxlength: [20, 'long UserName'] 
    }, 
}); 

UserSchema.pre('save', function (next) { 
    if (this.userName === null || this.userName === '') { 
     this.userName = undefined; 
    } 

    next(); 
}) 
0

Я думаю, что валидатор/плагин не является необходимым для выполнения этой задачи.

Если значение не требуется (required: false), то не предоставление его (или предоставление null) не приведет к проверке минимальной/минимальной длины. Если вы хотите разрешить либо пустую строку, либо строку, ограниченную длиной min/max, просто используйте регулярное выражение match, чтобы проверить это, например. /^$|^.{4, 255}$/, или динамически построить new RegExp("^$|^.{" + minLength + "," + maxLength + "}$").

Протестировано на мангусте 4.7.8

 Смежные вопросы

  • Нет связанных вопросов^_^