如何在 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 的不同文件中分离模式、方法和静态的主要内容,如果未能解决你的问题,请参考以下文章