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

how to resolve data and hash error in node js bcrypt

Error: data and hash arguments required

我正在使用节点 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();

告诉我哪里错了

问题在于这一行 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')
    }
  })

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

的 API 文档

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

bcrypt.compareSync 接受 2 个参数; passwordToCheck, passwordHash

您遇到错误 "bcrypt Error: data and hash arguments required"

此错误表示一个或两个参数为空或未定义, 在您的情况下,您需要确保密码 userData.password 正确运行 bcrypt.compareSync