2016-08-13 8 views
0

minlengthを使用して、オプションのstringフィールドタイプを使用するにはどうすればよいですか。ドキュメント(linked here)はこれについて詳しくは触れていませんか?私は試してみました:Mongooseオプションのminlengthバリデータ?

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

私が試したあらゆるバリエーションは何らかのタイプのエラーを返します。

minlengthmaxlengthを評価するのは、値がの場合のみです。

答えて

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()関数をオーバーライドし、カスタムバージョンは属性の検索を削除してフィールドを削除します。

ここに、プラグインの本体があります。

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」:ライン#4はschemaType.options.hide属性の有無をチェックを探します)あなたは追加のコードを書くことなくすべてのスキーマでこれを再利用することができます。プラグイン内ではようなもので機能を無効にできます。

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

    schema.pre('save', myCustomPreSaveHandler); 

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

カスタム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
私は、オプションの最小の長さと検証とユニークな文字列を望んでいた同じ苦境に走った

ので、私はトリックを行うために複数のバリデータを使用しました「事前に」空の文字列が一意ではありませんので、空の/ NULL値ありませんので、重複を削除するために保存方法を

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を入力しても)最小/最大長の検証がトリガーされません。 空の文字列または最小/最大の長さで制限された文字列を許可する場合は、これをテストするためにmatch正規表現を使用します(例: /^$|^.{4, 255}$/、または​​を動的に構築します。

マングーステスト済み4.7.8

関連する問題