bcrypt-node抛出错误 "未提供回调函数"。

9

我将使用JWT身份验证创建用户注册,同时使用bcrypt-node模块进行密码哈希和加盐。

userModel.js

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

var UserSchema=new Schema({
    name:{type:String, unique:true, required:true},
    password:{type:String, required:true}
});

    UserSchema.pre('save', function (next) {
        var user = this;
        if (this.isModified('password') || this.isNew) {
            bcrypt.genSalt(10, function (err, salt) {
                if (err) {
                    return next(err);
                }
                bcrypt.hash(user.password, salt, function (err, hash) {
                    if (err) {
                        return next(err);
                    }
                    user.password = hash;
                    next();
                });
            });
        } else {
            return next();
        }
    });

    UserSchema.methods.comparePassword = function (passw, cb) {
        bcrypt.compare(passw, this.password, function (err, isMatch) {
            if (err) {
                return cb(err);
            }
            cb(null, isMatch);
        });
    };

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

passport.js

var JwtStrategy     =require('passport-jwt').Strategy; 
var User                =require('../app/models/user');
var config            =require('../config/database');

module.exports=function(passport){
      var opts = {}; 
  opts.secretOrKey = config.secret;
  passport.use(new JwtStrategy(opts, function(jwt_payload, done) {
    User.findOne({id: jwt_payload.id}, function(err, user) {
          if (err) {
              return done(err, false);
          }
          if (user) {
              done(null, user);
          } else {
              done(null, false);
          }
      });
  }));
};

app.js

apiRoutes.post('/signup', function(req, res) {
  if (!req.body.name || !req.body.password) {
     res.json({success: false, msg: 'Please pass name and password.'});
         } else {
                var newUser = new User({
                                 name: req.body.name,
                                 password: req.body.password
                         });
    // save the user
        newUser.save(function(err) {
         if (err) {
                 return res.json({success: false, msg: 'Username already exists.'});
                }
                res.json({success: true, msg: 'Successful created new user.'});
                });
             }
        });

当我运行这段代码时,它显示错误 -
throw "No callback function was given".

No Callback function was given

请帮我修复这段代码。 谢谢。


请在您的问题中提供堆栈跟踪和一种找出代码行号的方法。 - Jason Livesay
2个回答

32

bcrypt.hash()需要4个参数:

hash(data, salt, progress, cb)

这份文档表述不清:它声明需要提供datasaltcb,这意味着progress不是必需的,但如果不提供会出现错误。

如果您不关心跟踪进度,请传递一个null

bcrypt.hash(user.password, salt, null, function (err, hash) { ... })

非常感谢.. null 对我很有效.. 现在用户已经成功创建。 - Saurabh Sharma
bcrypt-node 似乎不活跃了...?但 bcrypt 看起来是活跃的 https://github.com/kelektiv/node.bcrypt.js/,但有很多 bug,你在用哪个? - stackdave

1
没有提供回调函数,传入 null 表示不返回回调!
例如:
bcrypt.hash(password, salt, null, (err, hash)

我的路由器:
router.post('/create/', (req, res) => {

    const email = req.body.email;
    var password = req.body.password;
    var salt = bcrypt.genSaltSync(10);

    let errors = [];
    if (errors.length > 0) {

    } else {
        if (email) {
            pool.query('SELECT * FROM users WHERE email = ?', [email],
                (err, results) => {
                    if (results.length > 0) {
                        res.status(400);
                        res.json({ Return: req.body.email + " Já existe no Banco de dados" })
                    } else {
                        bcrypt.hash(password, salt, null, (err, hash) => {
                            req.body.password = hash
                            pool.query('INSERT INTO users( email, password) VALUES(?, ?)', [req.body.email, hash]);
                            res.status(200);
                            res.json({ Send: results })
                        })
                    }
                });
        } else {
            res.send('Enter Email');
        };
    }
});

如果您有新的问题,请通过单击提问按钮来提出。如果它有助于提供上下文,请包含此问题的链接。- 来自审核 - Julia

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接