我尝试在将电子邮件地址保存到数据库之前将其规范化为小写。猫鼬模型上的塞特犬非常适合这种情况,他们可以在简单的模型上工作。但是,当我尝试在嵌套对象上设置toLower setter时,电子邮件存储在" owner"我得到TypeError: Cannot call method 'toLowerCase' of undefined
function toLower(v){ return v.toLowerCase(); }
崩溃了:
var BusinessSchema = new mongoose.Schema({
owner: {
email: { type: String, required: 'Email adres mag niet leeg zijn.', set: toLower, get: toLower, index: { unique: true } },
password: { type: String, required: 'Wachtwoord mag niet leeg zijn.' }
}
});
这有效:
var UserSchema = new Schema({
email: { type: String, set: toLower }
});
答案 0 :(得分:3)
因为您还使用toLower
作为getter,所以在创建新文档时首先使用值undefined
调用它,然后再次使用实际值调用它。无论如何,你的toLower
函数需要保护自己,以便可以使用任何值调用它,而不仅仅是字符串。
类似于:
function toLower (v) {
if ('string' != typeof v) v = '';
return v.toLowerCase();
}
如果你不需要这个的getter方面,你也可以使用内置的lowercase
setter:
var BusinessSchema = new mongoose.Schema({
owner: {
email: {
type: String,
required: 'Email adres mag niet leeg zijn.',
lowercase: true,
index: { unique: true }
},
password: { type: String, required: 'Wachtwoord mag niet leeg zijn.' }
}
});