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 惯例。)
我在使用 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 惯例。)