mongoose set:toLower不能处理嵌套属性

时间:2014-12-11 10:25:06

标签: mongodb mongoose

我尝试在将电子邮件地址保存到数据库之前将其规范化为小写。猫鼬模型上的塞特犬非常适合这种情况,他们可以在简单的模型上工作。但是,当我尝试在嵌套对象上设置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 } 
});

1 个答案:

答案 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.' }
    }
});