使用 NodeJs Mongo 和 Express 在更新时保留散列密码

坦佐利尼奥

我正在尝试使用 MEAN 构建应用程序。在注册时,一切正常,用户将被引入数据库并使用字段密码并验证散列。但是在更新时,密码和验证将不再被散列,它们将作为纯文本添加到数据库中。我该如何解决这个问题?(我还没有前端代码,我用Postman发送请求)

这就是我现在所拥有的:

模型.js

var mongoose = require('mongoose');
var Schema = mongoose.Schema;
var bcrypt = require('bcrypt');

var schema = new Schema({
  firstname: { type: String, required: true },
  lastname: { type: String, required: true },
  email: { type: String, required: true },
  password: { type: String, required: true },
  verify: { type: String, required: true },
});

schema.pre('save', function (next) {
  var user = this;
  bcrypt.hash(user.password, 10, function (err, hash) {
    if (err) {
      return next(err);
    }
    user.password = hash;
    user.verify = hash;
    next();
  });
});

module.exports = mongoose.model('User', schema);

控制器.js

var router = express.Router();

// register user
router.post('/register', function (req, res, next) {
  addToDB(req, res);
});  

async function addToDB(req, res) {
  var user = new User({
    firstname: req.body.firstname,
    lastname: req.body.lastname,
    email: req.body.email,
    password: req.body.password,
    verify: req.body.verify
  });

  try {
    doc = await user.save();
    return res.status(201).json(doc);
  }
  catch (err) {
    return res.status(501).json(err);
  }
}

// update user
router.put('/:id', function (req, res, next) {
  User.findByIdAndUpdate(req.params.id, req.body, function (err, post) {
    if (err) {
      console.log('Error in user update: ' + JSON.stringify(err, undefined, 2));
      return next(err);
    }
    res.json(post);
  });
});
克里斯达姆

更新您的 Mongoose 中间件以仅在密码已被修改(或新)时对其进行哈希处理,例如

schema.pre('save',  function(next) {
    var user = this;

    // only hash the password if it has been modified (or is new)
    if (!user.isModified('password')) return next();

    // generate a salt
    bcrypt.genSalt(10, function(err, salt) {
        if (err) return next(err);

        // hash the password along with our new salt
        bcrypt.hash(user.password, salt, function(err, hash) {
            if (err) return next(err);

            // override the cleartext password with the hashed one
            user.password = hash;
            user.verify = hash
            next();
        });
    });
});

因为findByIdAndUpdate是一个包装器findOneAndUpdate,最好使用 save 以便调用 pre save 钩子

var _ = require('lodash');

// update user
router.put('/:id', function (req, res, next) {
    // fetch user
    User.findById(req.params.id, function(err, post) {
        if (err) return next(err);

        _.assign(post, req.body); // update user
        post.save(function(err) {
            if (err) return next(err);
            return res.json(200, post);
        })
    });
});

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

使用NodeJS和Axios遍历Mongo Collection

来自分类Dev

使用 VueJS、VuelidateJS 和 NodeJS/Express 时的项目结构

来自分类Dev

使用NodeJS和Express从MongoDB检索数据

来自分类Dev

使用NodeJS和Express接受GZIP文件

来自分类Dev

使用NodeJS和Express接受GZIP文件

来自分类Dev

当使用MySql,express,angular,nodejs时,express和node的端口会有所不同

来自分类Dev

不使用回调时的结果不确定。Nodejs,Express和SQL Server Express

来自分类Dev

不使用回调时的结果不确定。Nodejs,Express和SQL Server Express

来自分类Dev

锁定Mongo和Nodejs

来自分类Dev

使用Express和Mongo使用递归表制作节点树

来自分类Dev

在 Nodejs 中使用 greenlock-express 和 Express

来自分类Dev

使用express插入mongo

来自分类Dev

使用 Knex、Express 和 NodeJS 执行登录和注册

来自分类Dev

Mongodb 和 nodejs 与 express

来自分类Dev

使用nodejs和express从查询参数更新mysql数据表

来自分类Dev

如何使用 php 和 pdo 更新散列密码

来自分类Dev

在使用NodeJS和Express时如何创建MySQL连接池?

来自分类Dev

NodeJS / Express应用程序的使用顺序和用法

来自分类Dev

使用nodejs,express和mongoose的bluebird Promisies Crud示例

来自分类Dev

在nodeJS中使用express和socket.io时值重复

来自分类Dev

如何在NodeJS和Express中使用Angular包?

来自分类Dev

如何使用NodeJS和Express获取数据以显示行数?

来自分类Dev

使用Express和NodeJS滚动到EJS文件的ID

来自分类Dev

使用CoffeeScript和HAML生成NodeJS Express应用程序

来自分类Dev

使用 nodejs 和 express 不断收到 404 错误

来自分类Dev

使用 nodeJS express 和 EJS 发布 mySQL 值返回

来自分类Dev

NodeJS Express虚拟主机和更新app.js

来自分类Dev

router.post返回错误“未定义不是函数”。使用mongo和express.js

来自分类Dev

如何使用 Node.js Express、Mongo 和 Markdown-it 渲染 Markdown?

Related 相关文章

  1. 1

    使用NodeJS和Axios遍历Mongo Collection

  2. 2

    使用 VueJS、VuelidateJS 和 NodeJS/Express 时的项目结构

  3. 3

    使用NodeJS和Express从MongoDB检索数据

  4. 4

    使用NodeJS和Express接受GZIP文件

  5. 5

    使用NodeJS和Express接受GZIP文件

  6. 6

    当使用MySql,express,angular,nodejs时,express和node的端口会有所不同

  7. 7

    不使用回调时的结果不确定。Nodejs,Express和SQL Server Express

  8. 8

    不使用回调时的结果不确定。Nodejs,Express和SQL Server Express

  9. 9

    锁定Mongo和Nodejs

  10. 10

    使用Express和Mongo使用递归表制作节点树

  11. 11

    在 Nodejs 中使用 greenlock-express 和 Express

  12. 12

    使用express插入mongo

  13. 13

    使用 Knex、Express 和 NodeJS 执行登录和注册

  14. 14

    Mongodb 和 nodejs 与 express

  15. 15

    使用nodejs和express从查询参数更新mysql数据表

  16. 16

    如何使用 php 和 pdo 更新散列密码

  17. 17

    在使用NodeJS和Express时如何创建MySQL连接池?

  18. 18

    NodeJS / Express应用程序的使用顺序和用法

  19. 19

    使用nodejs,express和mongoose的bluebird Promisies Crud示例

  20. 20

    在nodeJS中使用express和socket.io时值重复

  21. 21

    如何在NodeJS和Express中使用Angular包?

  22. 22

    如何使用NodeJS和Express获取数据以显示行数?

  23. 23

    使用Express和NodeJS滚动到EJS文件的ID

  24. 24

    使用CoffeeScript和HAML生成NodeJS Express应用程序

  25. 25

    使用 nodejs 和 express 不断收到 404 错误

  26. 26

    使用 nodeJS express 和 EJS 发布 mySQL 值返回

  27. 27

    NodeJS Express虚拟主机和更新app.js

  28. 28

    router.post返回错误“未定义不是函数”。使用mongo和express.js

  29. 29

    如何使用 Node.js Express、Mongo 和 Markdown-it 渲染 Markdown?

热门标签

归档