带Mongoose OOP的Node.JS – 如何将mongoose数据访问代码与纯数据对象分开?

我遇到了Mongoose的一个devise问题 – 但也许我正在采取错误的方法?

在老的OOP风格,我想有一个名为用户类。 该类有几个成员,如用户名,名字,姓氏,盐和哈希,它有一个方法称为validation,它把散列密码作为参数。 然而,为了填充我的用户对象的数据,我需要写这样的代码,据我所知:

var userSchema = mongoose.Schema({ firstName: String, lastName: String, userName: String, salt: String, hashed_pwd:String }); userSchema.methods = { authenticate: function(passwordToMatch) { return crypto.hashPwd(this.salt, passwordToMatch) === this.hashed_pwd; } } 

这段代码混杂着Mongoose特定的代码 – 调用mongoose.Schema,并添加我必须使用userSchema.methods的方法。 当我试图分别声明我的User类并尝试创buildMongoose Schema时,我遇到了各种错误,并且成员方法未被识别。

所以当我想用同一个模式使用不同的数据库时,我必须重新声明一切。 但我想分开申报我所有的模式,因为它们将在我的应用程序中重复使用。

有没有什么优雅的解决scheme,是否有一个不同的库我可以使用,或者我是一个完全错误的方法?

提前致谢..

       

网上收集的解决方案 "带Mongoose OOP的Node.JS – 如何将mongoose数据访问代码与纯数据对象分开?"

这也许是一个部分的答案,但它可能有助于引导你在一个有用的方向。

这是值得了解什么是mongoose和它是做什么。 Mongoose是一个ODM(不是一个ORM- 读这里的差异 ,TL; DR:ODM是NoSQL,因为ORM是SQL;非关系DB是关系型数据库)Mongoose帮助抽象一些样板枯燥的东西,如validation; 处理数据或写入数据库时​​所需的东西。 这个validation的基础来自于mongoose.Schema用它来定义每个模型应该包含什么,以及模型上每个属性应该被转换为什么(即, 用户名应该是一个string, updatedOn应该是一个date戳 )。

如果你想要你的代码是数据库不可知的(即不需要任何特定的数据库),Mongoose不是你想要的。 如果不绑定到任何特定的数据库对你很重要,你应该尝试寻找一个数据库无关的ORM / ODM。 目前, Waterline浮现在脑海。

应该指出的是,如果你不关心mongoose提供的validation,数据转换等,那么你可以将vanilla MongoDB查询进行滚动,并将任何与JSON兼容的JavaScript对象粘贴到你的(NoSQL)数据库中。 但是,除非你完全理解你的失败/风险,否则不build议这样做。

我也可以争辩说,authentication方法没有位置在你的模型中,而应该存在于任何模型/数据库交互之前的位置(例如,如果你不遵循MVC约定,则在控制器或等价物中)。