Невозможно вернуть данные из функции bcrypt.compare () в nodejs с обещаниями - PullRequest
0 голосов
/ 05 апреля 2020

Я сейчас создаю приложение с nodejs (10.15.2), но у меня возникают некоторые проблемы с функцией входа в систему.

Фрагмент из моего файла "dbconnector. js":

login(email, password) {
    return userModel.findOne({
      email: email
    }).lean().then(function(user) {
      // return user;
      return bcrypt.compare(password, user.password, function(err, res) {

           if (res) {
              console.log(user); //prints the userinfo - works fine
              return user;
          }
        });
    });
};

Фрагмент из моей подачи. js file:

app.post('/login', async (req, res) => {

    var { email, password } = req.body;
    var user = await dbconnector.login(email,password);
    console.log(user) //returns undefined

    if (user != false) {
      console.log("loggedin");
        const accessToken = jwt.sign({ email: user.email,  id: user.id }, key.tokenKey);

        res.json({
            accessToken
        });
    } else {
        res.send('Username or password incorrect');
    }
});

Моя проблема в том, что функция login () возвращает неопределенное значение. Однако, когда я изменяю его на следующее, оно работает идеально (просто без проверки пароля ...):

  login(email, password) {
    return userModel.findOne({
      email: email
    }).lean().then(function(user) {
    return user;
    });
};

Так что я знаю, что что-то не так с частью bcrypt / обещание, но я не смог найти решение.

1 Ответ

0 голосов
/ 05 апреля 2020

Мой брат, проблема заключается в том, что обещание вернет вам только другое обещание и сравнительный обратный вызов, который у вас есть, так как его имя говорит, что обратный вызов не является оправданием. Давайте сделаем это обещание


login(email, password) {
    return userModel.findOne({
      email: email
    }).lean().then(function(user) {
      // return user;
      return new Promise((resolve, reject) => {
          return bcrypt.compare(password, user.password, (err, res) => {
              if (err) {
                  return reject(err);
              }

              return resolve(res);
        })
};

НО !!! если каким-либо образом используемый вами пакет bcrypt является https://www.npmjs.com/package/bcrypt, то вам не нужно обещать метод, он уже имеет обещание


login(email, password) {
    return userModel.findOne({
      email: email
    }).lean().then(function(user) {
      return bcrypt.compare(password, user.password);
    }).then(isEquals => {
        if (isEquals) {
            return true
        }

        return false
    }).catch(error => {
        throw error;
    })
};
...