哪个包更适合在真实项目 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 中使用?的主要内容,如果未能解决你的问题,请参考以下文章

哪个更适合tkinter网格,放置单个项目或循环遍历列表来放置它们?

mongoDB适用啥场合呢?

按键精灵有生成13位时间戳的代码或插件吗,求大神指点

如何整合redis mongodb mysql

插入、更新或删除 MongoDB 或 SQL 哪个更快?

一个相比jdk的io包更方便处理数据读写的包