gpt4 book ai didi

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

转载 作者:搜寻专家 更新时间:2023-11-01 00:42:42 26 4
gpt4 key购买 nike

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

在良好的旧 OOP 风格中,我想要一个名为 User 的类。该类有几个成员,例如用户名、名字、姓氏、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 类并尝试从中创建 Mongoose Schema 时,我遇到了各种错误,成员方法无法识别。

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

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

提前致谢..

最佳答案

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

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

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

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

我可能还会争辩说,authenticate 方法在您的模型中没有位置,而应该存在于任何模型/数据库交互之前的位置(例如,在 Controller 或等效项中,如果您不遵循 MVC约定。)

关于javascript - 带有 Mongoose OOP 的 Node.JS - 如何将 Mongoose 数据访问代码与纯数据对象分开?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29088039/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com