哪个包更适合在真实项目 mongodb 或 mongoose 中使用?
Posted
技术标签:
【中文标题】哪个包更适合在真实项目 mongodb 或 mongoose 中使用?【英文标题】:Which package is more preferable to use in a real project mongodb or mongoose? 【发布时间】:2020-03-14 22:37:27 【问题描述】:首先,this answer 不是我要找的。p>
我正在向教育项目添加一个数据库。对于前一个,我刚刚使用MongoDB.MongoClient
查询了数据库,并使用MongoDB.MongoClient.collection.insertOne
获取/设置了记录。
例如,添加用户很简单:
mongodb.MongoClient.collection("users").insertOne(
username,
password // jsut a sha512 password, which is sent hashed from UI
)
但据我了解,正确的方法(更好的方法)是创建一个 Mongoose Schema 并为其添加功能。但是密码的创建似乎比预期的要复杂得多。为什么会有这样的区别?如果从 UI 中窃取了密码,则使用多少加密并不重要。但是,如果密码只是经过哈希处理,那么从后端窃取密码也没关系 - 不可能使用已经哈希处理的密码触发该端点。
const UserSchema = new mongoose.Schema(
username:
type: String,
lowercase: true,
unique: true,
index: true,
required: [true, 'username can\'t be blank'],
match: [/^[a-zA-Z0-9]+$/, 'username is invalid'],
,
salt: String,
hash: String,
);
UserSchema.plugin(uniqueValidator, message: 'is already taken.');
UserSchema.methods.setPassword = function(password)
this.salt = crypto.randomBytes(16).toString('hex');
this.hash = crypto.pbkdf2Sync(password, this.salt, 10000, 512, 'sha512').toString('hex');
;
基本上,问题是: 哪种方式更好,并且任何方式都暗示我必须使用那种巨大的加密? 据我了解,可以有 1 个带有 mongodb.collection(*) 函数的单个文件,或者几十个模式。为什么答案仍然不明显?
【问题讨论】:
【参考方案1】:-
Mongoose 在后台使用 mongodb 驱动程序
将 CPU/内存繁重的任务放在客户端并不是一个好习惯
mongoose 和 mongodb 原生驱动程序都不会强迫您使用任何东西,是否对密码进行哈希处理(以及应该使用多重的加密)完全取决于您。
所以基本上我会建议您使用原生 mongo 驱动程序,使用来自 nodejs docs 的任何非常简单的散列,并在插入之前添加用户创建的散列:
const hash = (password) =>
const hash = crypto.createHash('sha256');
hash.update(password);
return hash.digest('hex');
...
app.post('/user', async (req, res) =>
try
// validation of user credentials here
const userToInsert = ...req.body, password: hash(req.body.password) ;
await mongodb.MongoClient.collection("users").insertOne(userToInsert);
res.status(201).send("done");
catch (err)
console.error(err);
res.status(500).send('internal server error');
)
【讨论】:
以上是关于哪个包更适合在真实项目 mongodb 或 mongoose 中使用?的主要内容,如果未能解决你的问题,请参考以下文章