保存模型

时间:2015-12-08 07:21:32

标签: javascript node.js mongodb mongoose

插件在Mongoose.js中是一个非常强大的功能,但有一件事我一直坚持。保存模型时,我只需要将所需的插件加载到Schema中。因为如果我不这样做,其他不必要的插件会自动加载以及许多验证错误。

这是我的架构

// models/user_collection.js
var mongoose = require('mongoose');
var Schema = mongoose.Schema;
var UserSchema = new Schema({
    username: { type: String, required: true },
    password: { type: String, required: true },
    role: String // either 'memeber' or 'admin'
});

// Member User Plugin
UserSchema.plugin(function (schema) {
    schema.add({
        locality: { type: String, required: true },
        contactNo: { type: Number, min: 13, max: 13 }
    });
});

// Admin User Plugin
UserSchema.plugin(function (schema) {
    schema.add({
        accountNo: { type: String, required: true },
        settingsArray: Array
    });
});

mongoose.model('User', UserSchema);

现在每当我尝试仅为成员用户保存记录时,Schema会自动加载Admin插件,并以验证错误进行响应。

所以,

var member = new User();
member.username = 'XYZ';
member.password = createHash('ABC') // a hashing method;
member.role = 'member';
member.locality = 'USA';
member.contactNo = 123456;
member.save(function(err, user) {
   if(err) { console.log(err); res.send(err); return; }
   // if successful I do my stuff
});

一旦执行了save方法,我就会收到来自Admin的验证错误 “accountNo是必需的”,(我不会在这里粘贴堆栈跟踪,它会变得混乱,但你明白了)

现在我知道它不是Mongoose.js的问题或错误,但我在这里做错了。你们能指导我如何正确地做到这一点吗?

1 个答案:

答案 0 :(得分:0)

问题是你将这两个插件应用于同一个架构。因此,所有插件功能都被添加到架构中。因此需要accountNolocality。插件用于在一个地方定义公共代码,并在不同的模式中使用它。

您在此处使用插件的方式,您只需将模型的定义细分为较小的部分。您也可以将所有内容置于模式之下并获得相同的效果。

再次阅读plugins

正如你所说,我认为判别者是可行的方式。