保存密码前对密码进行hash

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

  if (user.isModified('password')) {    bcrypt.genSalt(10, (err, salt) => {      bcrypt.hash(user.password, salt, (err, hash) => {        user.password = hash;        next();      });    });  } else {    next();  }});

完整代码

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281
var mongoose = require('mongoose');var express = require('express');var bodyParser = require('body-parser');const {ObjectID} = require('mongodb');var _ = require('lodash');

const validator = require('validator');

const jwt = require('jsonwebtoken');const bcrypt = require('bcryptjs');//appvar app = express();const port = process.env.PORT || 3000;//express middleware  Jonson对象与字符串转换。app.use(bodyParser.json());

//mongoose.Promise = global.Promise;//连接mogodbmongoose.connect(process.env.MONGODB_URI || 'mongodb://localhost:27017/TodoApp');

//模版var Todo = mongoose.model('Todo',{    text:{      type:String,  //类型      required:true, //必须要有      minlength:1, //最小长度      trim:true   //去除空格    },    completed:{      type:Boolean,      default:false  //默认值    },    completedAt:{      type:Number,      default:null    }});

var UserSchema = new mongoose.Schema({  email: {    type: String,    required: true,    trim: true,    minlength: 1,    unique: true,    validate: {      validator: validator.isEmail,      message: '{VALUE} is not a valid email'    }  },  password: {    type: String,    require: true,    minlength: 6  },  tokens: [{    access: {      type: String,      required: true    },    token: {      type: String,      required: true    }  }]});

UserSchema.methods.toJSON = function () {  var user = this;  var userObject = user.toObject();

  return _.pick(userObject, ['_id', 'email']);};

UserSchema.methods.generateAuthToken = function () {  var user = this;  var access = 'auth';  var token = jwt.sign({_id: user._id.toHexString(), access}, 'abc123').toString();

  user.tokens = user.tokens.concat([{access,token}]);

  return user.save().then(() => {    return token;  //返回token  });};

UserSchema.statics.findByToken = function (token) {  var User = this;  var decoded;

  try {    decoded = jwt.verify(token, 'abc123');  } catch (e) {    return Promise.reject();  }

  return User.findOne({    '_id': decoded._id,    'tokens.token': token,    'tokens.access': 'auth'  });};

//在保存之前执行操作。

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

//保存时对于密码的更新  if (user.isModified('password')) {    bcrypt.genSalt(10, (err, salt) => {      //密码变为了hash      bcrypt.hash(user.password, salt, (err, hash) => {        user.password = hash;        next();      });    });  } else {    next();  }});

var User = mongoose.model('User', UserSchema);

//auth middlewire

var authenticate = (req, res, next) => {  var token = req.header('x-auth');

  User.findByToken(token).then((user) => {    if (!user) {      return Promise.reject();    }

    req.user = user;    req.token = token;    next();  }).catch((e) => {    res.status(401).send();  });};

app.get('/users/me', authenticate, (req, res) => {  res.send(req.user);});

//express routeapp.post('/todos',(req,res)=>{//  console.log(req.body);

    //建立对象document    var todo = new Todo({        text:req.body.text    });    //保存      todo.save().then((doc)=>{      res.send(doc);    },(e)=>{        res.status(400).send(e);    });

})//获取所有属性

app.get('/todos', (req, res) => {  Todo.find().then((todos) => {    res.send({todos});  }, (e) => {    res.status(400).send(e);  })});

//查询idapp.get('/todos/:id', (req, res) => {  var id = req.params.id;

  if (!ObjectID.isValid(id)) {    return res.status(404).send();  }

  Todo.findById(id).then((todo) => {    if (!todo) {      return res.status(404).send();    }

    res.send({todo});  }).catch((e) => {    res.status(400).send();  });});

//删除app.delete('/todos/:id', (req, res) => {  var id = req.params.id;

  if (!ObjectID.isValid(id)) {    return res.status(404).send();  }

  Todo.findByIdAndRemove(id).then((todo) => {    if (!todo) {      return res.status(404).send();    }

    res.send({todo});  }).catch((e) => {    res.status(400).send();  });});

//更新app.patch('/todos/:id', (req, res) => {  var id = req.params.id;  var body = _.pick(req.body, ['text', 'completed']);

  if (!ObjectID.isValid(id)) {    return res.status(404).send();  }

  if (_.isBoolean(body.completed) && body.completed) {    body.completedAt = new Date().getTime();  } else {    body.completed = false;    body.completedAt = null;  }

  Todo.findByIdAndUpdate(id, {$set: body}, {new: true}).then((todo) => {    if (!todo) {      return res.status(404).send();    }

    res.send({todo});  }).catch((e) => {    res.status(400).send();  })});

// POST /usersapp.post('/users', (req, res) => {  var body = _.pick(req.body, ['email', 'password']);  var user = new User(body);

  user.save().then(() => {    return user.generateAuthToken(); //调用方法,产生auth token并保存。  }).then((token) => {    res.header('x-auth', token).send(user); //设置了响应头  }).catch((e) => {    res.status(400).send(e);  })});

//监听app.listen(port,()=>{    console.log(`Start on port ${port}`);});module.exports = {   app,   Todo}

测试

123456789101112131415161718
1、打开mongoDB > ./mongod -dbpath /Users/jackson/Downloads/mongodb-data2、运行 >node postman.js3、打开postman 选择post 输入 >localhost:3000/usersBody中填入:{    "email": "zhuimengshaonian07@gmail.com", "password" : "123abc!"}返回:{    "_id": "5bfe716591e78c6a4ad8c164",    "email": "zhuimengshaonian07@gmail.com"}

header:x-auth →eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJfaWQiOiI1YmZlNzE2NTkxZTc4YzZhNGFkOGMxNjQiLCJhY2Nlc3MiOiJhdXRoIiwiaWF0IjoxNTQzNDAxODI5fQ.wOKNzkls_w_jA5YVkCo0r9gFZ4-KtD6GarRiCDpAPr8

4、查看studio 3T 发现密码变为了hash之后的数字。
  • 本文链接: https://dreamerjonson.com/2018/11/29/node-27-mongodb-password-hash/

  • 版权声明: 本博客所有文章除特别声明外,均采用 CC BY 4.0 CN协议 许可协议。转载请注明出处!

转载于:https://blog.51cto.com/13784902/2324955

nodejs渐入佳境[27]-express+mongodb+middleware实现密码哈希相关推荐

  1. nodejs+express+mongodb简单的例子

    简单的介绍下node+express+mongodb这三个东西. node:是运行在服务器端的程序语言,表面上看过去就是javascript一样的东西,但是呢,确实就是服务器语言,个人觉得在一定层次上 ...

  2. Express + mongoDB + nodejs

    Express + mongoDB开发web接口 Experss开发web接口 菲关系型数据库mongodb 使用nodejs的mongoose模块链接和操作mongodb Express 基于nod ...

  3. NodeJS+Express+MongoDB - 张果 - 博客园

    目录 一.MongoDB 1.1.安装MongoDB 1.1.1.配置运行环境 1.1.2.运行MongoDB 1.2.数据库操作 1.2.1.创建数据库与查看数据库 1.2.2.删除数据库 1.2. ...

  4. nodejs实战《一起学 Node.js》 使用 Express + MongoDB 搭建多人博客

    GitHub: https://github.com/nswbmw/N-blog N-blog 使用 Express + MongoDB 搭建多人博客 开发环境 Node.js: 6.9.1 Mong ...

  5. vue+websocket+express+mongodb实战项目(实时聊天)(一)

    ##vue+websocket+express+mongodb实战项目(实时聊天)(一) 在原来基础上增加了多个聊天室以及发送图片[vue+websocket+express+mongodb实战项目( ...

  6. node+express+mongodb初体验

    从去年11月份到现在,一直想去学习nodejs,在这段时间体验了gulp.grunt.yeomen,fis,但是对于nodejs深入的去学习,去开发项目总是断断续续. 今天花了一天的时间,去了解整理整 ...

  7. Node.js Express+Mongodb 项目实战

    Node.js Express+Mongodb 项目实战 这是一个简单的商品管理系统的小项目,包含的功能还算挺全的,项目涵盖了登录.注册,图片上传以及对商品进行增.删.查.改等操作,对于新手来说是个很 ...

  8. React + Redux + Express + Mongodb 零基础开发完整大型商城网站视频教程(97 个视频)

    React + Redux + Express + Mongodb 零基础开发完整大型商城网站视频教程(97 个视频) mern 架构零基础开发完整电商网站 React + Redux + Expre ...

  9. Express+MongoDB服务端开发教程

    本项目源码地址 my_express_server 参考资料 NodeJS服务端开发极速入门 准备工作 安装一些必要的全局依赖 # 全局暴力设置淘宝源 npm config set registry ...

最新文章

  1. 快速上手RaphaelJS-Instant RaphaelJS Starter翻译(一)
  2. 视频采集-非DICOM影像设备转DICOM标准的解决方案
  3. 市电会引起UPS产生故障吗
  4. QList模板类常用接口函数
  5. Git的Patch功能
  6. Redis RDB与AOF持久化详解
  7. 搭建tidb集群linux_无服务器计算,学习Go,Linux系统恢复,TiDB,Udev等
  8. 软件工程采取了哪些措施以保证最终能够交付给用户一个高质量、低成本的软件产品?
  9. 酒店房间登记与计费管理系统《c语言课程设计》 文库,C语言课程设计--酒店房间登记与计费管理系统程序代码...
  10. MAC搭建ios自动化测试环境
  11. iphone屏幕镜像如何全屏_苹果手机屏幕镜像如何连接电视
  12. 每天一个JavaScript小特效——会魔法的旋转魔方相册
  13. html怎样使字数占相同位,《古对今》教案
  14. 实用:Google Chrome(谷歌浏览器)键盘快捷键大全
  15. 转自国学大师--南怀谨先生
  16. python计算导数_python计算导数并绘图的实例
  17. MacBookPro使用分享及软件推荐
  18. 基于C++实现两个分数的加减法
  19. Linux 系统中 resolv.conf 文件详解
  20. 前端使用sm2、sm3加密解密 案例

热门文章

  1. 3星|《财经》年刊:各行业专家学者的现状分析与短期预测
  2. 斯诺登称美向日提供监控系统 日本人或遭大规模监控
  3. 让 QtWebkit 支持跨域CROS - nowboy的CSDN博客 - 博客频道 - CSDN.NET
  4. Frost Sullivan权威报告:阿里云再次领跑云WAF大中华区市场
  5. zabbix自动发现oracle表空间并监控其使用率
  6. 初创企业不上云拿什么“火拼”?
  7. Ubuntu用户通过Folder Color修改文件夹颜色-让桌面更多彩
  8. WiFi CC3200模块 加速IOT物联网发展
  9. error code [17027]; 流已被关闭;
  10. 佩恩:京奥了不起 10年后“水落石出”