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

Posted

技术标签:

【中文标题】如何在 Mongoose 的不同文件中分离模式、方法和静态【英文标题】:How to separate schemas, methods and statics in different files in Mongoose 【发布时间】:2018-05-15 15:12:08 【问题描述】:

我正在尝试使用 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 实例中检索模式(仅是模型)以分配方法。

我错过了什么吗?分离方法和静态是否有更好的选择?

【问题讨论】:

【参考方案1】:

你可以这样做:

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

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);

我很确定这会奏效:)

【讨论】:

太棒了!这就是我要找的东西!【参考方案2】:

这是一种方法。

UserMethods.js

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

用户.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;

【讨论】:

【参考方案3】:

所以,我要说的第一件事是,如果架构文件中有 1500 多行,那么很有可能您在模型逻辑中放入了太多东西,而不是使用包含功能的模块然后你可以在你的模型中连接在一起。

也就是说,最笨拙的方法实际上是利用他们的插件架构。这是获得重用和分离的好方法。

假设您想将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.  

【讨论】:

以上是关于如何在 Mongoose 的不同文件中分离模式、方法和静态的主要内容,如果未能解决你的问题,请参考以下文章

如何从字符串中分离许多不同的单词(Java)

在 Git 中分离项目的不同部分

我应该如何在我的数据库设计中分离这些数据

如何在单个 TCP 数据包中从不同文件中分离数据?

如何在 cassandra 中将环从集群中分离出来

在 Rails 中分离后端和前端服务器