错误:未捕获,未指定"错误"事件。 (不是有效的BCrypt哈希值。)

时间:2017-07-26 11:55:57

标签: javascript node.js express mongoose bcrypt

我正在尝试在nodejs中创建一个api用于登录。但是当我通过Http请求者检查登录路由时,它在输出和命令行中没有显示任何错误错误:未捕获,未指定"错误&#34 ;事件。 (不是有效的BCrypt哈希。),我发现密码没有以加密/哈希的形式存储在数据库中。

项目结构: enter image description here

server.js文件:



var express    = require('express');
var app        = express();
var port       = process.env.PORT||8080;
var morgan     = require('morgan');
var mongoose   = require('mongoose');
var bodyParser = require('body-parser');
var router     = express.Router();
var appRoutes  = require('./app/routes/api')(router);
var path       = require('path');

app.use(morgan('dev'));
app.use(bodyParser.json()); 
app.use(bodyParser.urlencoded({ extended: true })); 
app.use(express.static(__dirname + '/public'));
app.use('/api',appRoutes);


mongoose.connect('mongodb://localhost:27017/tutorial', function(err){
	if(err) {
		console.log('Not connected to the Database: '+ err);
	}
	else {
		console.log('Succesfully connected to Mongodb');
	}
});

app.get('*',function(req,res){
     res.sendFile(path.join(__dirname + '/public/app/views/index.html'));
});

app.listen(port, function () {
	console.log('Running the server on port ' + port);
});   




/app/models/user.js:



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

var UserSchema = new Schema({
   username: { type: String, lowercase: true, required: true, unique: true },
   password: { type: String, required: true },
   email: { type: String, lowercase: true, required: true, unique: true }

});

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

UserSchema.methods.comparePassword = function(password) {
    return bcrypt.compareSync(password, this.password); 
};


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

 




/app/routes/api.js:



var User       =require('../models/user');

module.exports = function(router) {
  //http://localhost:8080/api/users
  //User Registration Route
  router.post('/users', function(req,res){
    var user = new User();
    user.username = req.body.username;
    user.password = req.body.password;
    user.email    = req.body.email;
  if (req.body.username == null ||  req.body.username == '' || req.body.email == null || req.body.email == ''|| req.body.password == null  || req.body.password == ''  ){
    res.send('Ensure Username, Email and Password is provided');
  
  } else {
        user.save(function(err){
      if(err){
       res.send('Username or Email already exist');
      }
      else {
        res.send('User created!!!')
      }
    });
  }
    
});
   //User login Route
   //http://localhost:8080/api/authenticate
   router.post('/authenticate',function(req,res) {
       User.findOne({ username: req.body.username }).select('email username password').exec(function(err,user){
        if (err) throw err;
        if (!user){
          res.json({ success: false, message: 'Could not authenticate user'});
        }else if(user){
             var validPassword = user.comparePassword(req.body.password);
             if(!validPassword){
              res.json({ success: false, message: 'Could not authenticate user'});
             }else {
              res.json({ success: true, message: 'User Authenticate!!!'});
             }
        }
       });
   });

  return router;
}




HTTP请求者(它适用于/app/models/api.js中的注册api)并且用户已成功注册} enter image description here

终端:

enter image description here

数据库: (其中密码未存储在哈希中我不知道为什么这可能是主要问题)

enter image description here

1 个答案:

答案 0 :(得分:2)

您的代码在预保存功能中调用next()两次,将其删除如下:

UserSchema.pre('save', function(next) {
  var user = this;
  bcrypt.hash(user.password, null, null, function(err, hash) {
    if (err) return next(err);
    user.password = hash;
     next();
});
  next(); // function to remove
});