插件在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的问题或错误,但我在这里做错了。你们能指导我如何正确地做到这一点吗?
答案 0 :(得分:0)
问题是你将这两个插件应用于同一个架构。因此,所有插件功能都被添加到架构中。因此需要accountNo
和locality
。插件用于在一个地方定义公共代码,并在不同的模式中使用它。
您在此处使用插件的方式,您只需将模型的定义细分为较小的部分。您也可以将所有内容置于模式之下并获得相同的效果。
再次阅读plugins。
正如你所说,我认为判别者是可行的方式。