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

我试图用Mongoose来改进我的Nodejs代码的文件结构。

我已经在不同的文件中分离了每个模式,但是对于一些模式来说,方法和静态的数量是相当大的,我最后会遇到太大(大于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实例中检索纲要(只有模型)来分配方法。

我错过了什么吗? 分离方法和静力学有没有更好的select?

你可以做这样的事情:

make一个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); 

我很确定这将工作:)

这是做这件事的一种方法。

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; 

所以,我要说的第一件事是,如果在模式文件中有超过1500行代码,那么很可能是你在模型逻辑中放了太多东西,而不是利用可以保存function的模块然后在您的模型中连接在一起。

也就是说,最简单的方法就是使用插件架构。 这是获得重用以及分离的好方法。

假设您想要将findByName方法作为静态添加到所有模式,因为许多模式可能具有“名称”属性。 你可以定义这个:

 // ./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; 

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

 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.