如何在Mongoose中的不同文件中分离模式,方法和静态

时间:2017-12-01 13:38:38

标签: node.js mongodb mongoose

我正在尝试使用Mongoose改进Nodejs代码的文件结构。

我已经在不同的文件中分离了每个Schema,但是对于某些模式,方法和静态的数量非常大,我最终会得到太大的模式文件(> 1500行)。

我想将不同文件中的方法和模式分开,并在模式中“需要”它们

var mongoose = require("mongoose");
var Schema = mongoose.Schema;
var UserSchema = new Schema({
  email: String,
  pwdhash: String,
});

UserSchema.methods.someMethod1 = function() {
  // Do something 1
};

UserSchema.methods.someMethod2 = function() {
  // Do something 2
};

var User = mongoose.model("User", UserSchema);

我希望它看起来像这样:

var mongoose = require("mongoose");
var Schema = mongoose.Schema;
var UserSchema = new Schema({
  email: String,
  pwdhash: String,
});

// Requiring methods
require("./methods/user.js");

var User = mongoose.model("User", UserSchema);

但是,在/methods/user.js文件中,我无法找到如何从mongoose实例中检索Schema(仅模型)来分配方法。

我错过了什么吗?是否有更好的替代方法来分离方法和静力学?

3 个答案:

答案 0 :(得分:2)

您可以这样做:

制作一个methods.js文件,并在方法文件中添加以下代码:

module.exports = function(UserSchema) {
    UserSchema.methods.someMethod1 = function() {
    // Do something 1
    };

    UserSchema.methods.someMethod2 = function() {
    // Do something 2
    };
}

之后在主文件中,你必须这样做:

var mongoose = require("mongoose");
var Schema = mongoose.Schema;
var UserSchema = new Schema({
  email: String,
  pwdhash: String,
});

// Requiring methods
require("./methods.js")(UserSchema);

var User = mongoose.model("User", UserSchema);

我很确定这会奏效:)

答案 1 :(得分:0)

这是一种做法。

UserMethods.js

module.exports = {
 someMethod1: function() {...};
 someMethod2: function() {...};
}

user.js的

var mongoose = require("mongoose");
var Schema = mongoose.Schema;
var UserSchema = new Schema({
  email: String,
  pwdhash: String,
});

Object.assign(UserSchema.methods, require("./UserMethods.js"));

var User = mongoose.model("User", UserSchema);
module.exports = User;

答案 2 :(得分:0)

所以,我要说的第一件事是,如果你在一个模式文件中有超过1500行,那么你很有可能将过多的东西放入模型逻辑而不是利用具有功能的模块,然后可以在模型中连接在一起。

尽管如此,实现这一目标的最实际方法实际上是利用他们的插件架构。这是获得重用和分离的好方法。

假设您要将// ./plugins/find-by-name.js function findByName(name, callback) { this.find({ name: new RegExp(name, 'i') }, callback); } function findByNamePlugin(schema, options) { schema.statics.findByName = findByname; } module.exports = findByNamePlugin; 方法作为静态添加到所有模式中,因为许多模式可能具有“#name”名称'属性。您可以定义:

var mongoose = require("mongoose");
var findByNamePlugin = require('./plugins/findByName');
var Schema = mongoose.Schema;
var UserSchema = new Schema({
  email: String,
  pwdhash: String,
});
UserSchema.plugin(findByNamePlugin);
// add others.  

然后在您的UserSchema文件中,您可以只需要并添加它们。

org.springframework.cache