如何解决节点js bcrypt中的数据和哈希错误

时间:2018-10-08 12:42:24

标签: node.js callback bcrypt

  

错误:需要数据和哈希参数

我正在使用以下方法在节点js中进行简单的登录注册并忘记密码 bcrypt哈希

代码:用于登录

app.post('/login', (req, res) => {
  console.log('login');
  let {email, password} = req.body;
    User.updateOne({email: email}, ' email password', (err, userData) => {
        if (!err) {
            let passwordCheck = bcrypt.compareSync(password, userData.password);
            if (passwordCheck) { 
            console.log('login2');
                req.session.user = {
                  email: userData.email,
                  id: userData._id
                }; 
                req.session.user.expires = new Date(Date.now() + 3 * 24 * 3600 * 1000);
                res.status(200).send('You are logged in, Welcome!');
            } else {
              res.status(401).send('incorrect password');
              console.log('login3');
            }
        } else {
          res.status(401).send('invalid login credentials');
          console.log('login4');
        }
    });
});

注册代码:

app.post('/signup', (req, res) => {
  let {email, password} = req.body; 

    let userData = {password: bcrypt.hashSync(password, 5, null), email };
    console.log('out save');

    let newUser = new User(userData);

     newUser.save().then(error => {
        if (!error) {
        console.log('in save');
            return res.status(200).json('signup successful');
        } else { 
            if (error.code ===  11000) { 
                return res.status(409).send('user already exist!');
            } else {
                console.log(JSON.stringigy(error, null, 2)); 
                return res.status(500).send('error signing up user');
            }
        }
    });
});

我尝试在控制台上记录几行,结果发现代码没有进入注册

newUser.save();

告诉我我要去哪里

2 个答案:

答案 0 :(得分:1)

问题在于此行newUser.save().then(error => {。您注意到.then()吗?那是一个已解决的承诺,因此它不会返回错误。通常,您会看到类似这样的内容。

Promise()
  .then((result) => {
    // result is a resolved promise
  })
  .catch((error) => {
    // error is a rejected promise
  })

因此,您应该尝试将代码更改为此:

newUser.save()
  .then(result => {
    console.log('in save')
    return res.status(200).json('signup successful')
  })
  .catch(error => {
    if (error.code === 11000) { 
      return res.status(409).send('user already exist!')
    } else {
      console.log(JSON.stringigy(error, null, 2))
      return res.status(500).send('error signing up user')
    }
  })

您似乎在使用猫鼬,这是Document.prototype.save() https://mongoosejs.com/docs/api.html#document_Document-save

的API文档

他们的文档大部分使用回调函数,但是如果滚动到.save()文档的末尾,则会看到它们显示了一个带有承诺的示例。

答案 1 :(得分:0)

bcrypt.compareSync具有2个参数; passwordToCheck,passwordHash

您遇到错误“ bcrypt错误:需要数据和哈希参数”

此错误表示一个或两个参数为null或未定义, 您需要确保密码userData.password正确输入到函数bcrypt.compareSync

中。