Node.JS 使用 Mongoose OOP - 如何将 Mongoose 数据访问代码与纯数据对象分开?

Node.JS with Mongoose OOP - how to separate mongoose data access code from pure data object?

我在使用 Mongoose 时遇到了一些设计问题 - 但也许我采用了错误的方法?

在良好的旧 OOP 风格中,我想要一个名为 User 的 class。 class 有几个成员,如用户名、名字、姓氏、salt 和哈希,它有一个名为 authenticate 的方法,该方法将哈希密码作为参数。 然而,为了用数据填充我的用户对象,我需要编写这样的代码,据我所知:

    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 class 并尝试从中创建 Mongoose Schema 时,我遇到了各种错误,并且无法识别成员方法。

所以当我想使用相同模式的不同数据库时,我必须重新声明所有内容。 但是我想单独声明我的所有模式,因为它们会在我的应用程序中的所有地方重新出现。

是否有任何优雅的解决方案,我可以使用不同的库,还是我采用了完全错误的方法?

提前致谢..

这可能是一个部分答案,但它可能有助于指导您朝着有用的方向前进。

了解猫鼬是什么以及它的作用是值得的。 Mongoose 是一个 ODM(不是 ORM—read here for the difference。TL;DR:ODM 之于 NoSQL 正如 ORM 之于 SQL;非关系数据库到关系数据库。)Mongoose 有助于抽象一些样板无聊的东西,比如验证;在处理数据库中的数据或写入数据库时​​需要的东西。此验证的基础来自 mongoose.Schema,您可以使用它定义每个模型应包含的内容以及模型上每个 属性 应转换为的内容(即 username 应是一个字符串,updatedOn 应该是一个日期戳。)

如果您希望您的代码与数据库无关(也就是说,不需要任何特定的数据库),Mongoose 不是您想要的。如果不依赖于任何特定的数据库对您来说很重要,您应该尝试寻找与数据库无关的 ORM/ODM。此刻,Waterline浮现在脑海中。

应该提到的是,如果您不关心 mongoose 提供的验证、数据转换等,您可以只滚动香草 MongoDB 查询并坚持任何 JSON 兼容JavaScript 对象到您的 (NoSQL) 数据库中。但不建议这样做,除非您完全了解这样做的损失/风险。

我可能还会争辩说,authenticate 方法在您的模型中没有位置,而应该存在于任何 model/database 交互之前的位置(例如,在控制器中或等效的位置,如果您不是遵循 MVC 惯例。)