Node.js 结果对象在赋值时返回为未定义

Node.js 结果对象在赋值时返回为未定义,node.js,Node.js,我正在创建一个results对象来返回一个布尔值和一个字符串。没有在if语句中重新分配它。其余代码工作正常,密码得到更新,或者正确的错误消息被输出到控制台 在尝试捕捉之前,我已尝试保留未定义的结果 async function passwordUpdate(password, currentPassword, newPwd, email) { let hashedPassword = await bcrypt.hash(newPwd, 10); let result = { succe

我正在创建一个results对象来返回一个布尔值和一个字符串。没有在if语句中重新分配它。其余代码工作正常,密码得到更新,或者正确的错误消息被输出到控制台

在尝试捕捉之前,我已尝试保留未定义的结果

async function passwordUpdate(password, currentPassword, newPwd, email) {
  let hashedPassword = await bcrypt.hash(newPwd, 10);
  let result  = { success: false , message: ' '};

  try {
    bcrypt.compare(currentPassword, password, async function (err, res) {
      if (res) {
        let updateResult = await updatePwd(hashedPassword, email);
        if (updateResult) {
         result = { success: true , message: 'Password was updated successfully.'}; 
        }
        else {
          logger.info('Password was not updated successfully.');
        }
      } else {
        logger.error('Passwords do not match');
        result= { success: false , message: 'Your current password was entered incorrectly'};

        logger.error(result.message);
      }
    });
  } catch (error) {
    result= { success: false , message: 'Failed to compare passwords'}
  }
  logger.error('result ', result.message);
  return result;
}
此方法正在调用代码

app.post('/passwordUpdate', async (req, res) => {
  let pwd = req.body.password;
  let cpwd = req.body.currentPwd;
  let newPwd = req.body.newPwd;
  let email = req.body.email;

  try {
    let result = await usersModel.passwordUpdate(pwd, cpwd, newPwd, email);
    console.log(result, result.success, result.message);
    if (result.success) {
      res.status(200).json({error: result.message});
    }
    else {
      res.status(404).json({error: result.message});
    }
  } catch (error) {
     console.log(error);
  }
});
记录器错误(结果消息);else语句中的这一行按预期输出消息,但

logger.error('result',result.message);在try/catch输出结果的空白消息后。执行此操作时,消息

let result = await usersModel.passwordUpdate(pwd, cpwd, newPwd, email);
passwordUpdate
函数正在基于该函数的“顶层”解析承诺。这意味着
bcrypt.compare
的回调函数不会影响
passwordUpdate
的返回,这就是为什么您没有看到要查找的结果

您可以做的是将整个事情包装成一个承诺,并在
bcrypt.compare
函数中调用
resolve
/
reject

async function passwordUpdate(password, currentPassword, newPwd, email) {
  return new Promise(async function(resolve, reject) {
    let hashedPassword = await bcrypt.hash(newPwd, 10)

    try {
      bcrypt.compare(currentPassword, password, async function(err, res) {
        if (res) {
          let updateResult = await updatePwd(hashedPassword, email)
          if (updateResult) {
            resolve({
              success: true,
              message: 'Password was updated successfully.',
            })
          } else {
            reject({
              success: false,
              message: 'Password was not updated successfully.',
            })
          }
        } else {
          reject({
            success: false,
            message: 'Your current password was entered incorrectly',
          })
        }
      })
    } catch (error) {
      reject({ success: false, message: 'Failed to compare passwords' })
    }
  })
}
您还将注意到我删除了日志记录,如果您愿意,您可以将它们放回去,但由于这是一个承诺,您可以从调用方更集中地在
中记录错误。然后
.catch
尝试
/
catch
,如果您使用的是
异步
/
等待

此外,我还建议,由于您可以根据
解析
拒绝
来确定它是否为错误,因此您可以从结果中删除
成功
,只返回一个字符串,这将使代码更干净:

async function passwordUpdate(password, currentPassword, newPwd, email) {
  return new Promise(async function(resolve, reject) {
    const hashedPassword = await bcrypt.hash(newPwd, 10)

    try {
      bcrypt.compare(currentPassword, password, async function(err, res) {
        if (res) {
          const updateResult = await updatePwd(hashedPassword, email)

          if (updateResult) {
            resolve('Password was updated successfully.')
          } else {
            reject('Password was not updated successfully.')
          }
        } else {
          reject('Your current password was entered incorrectly')
        }
      })
    } catch (error) {
      reject('Failed to compare passwords')
    }
  })
}

PS:我没有测试上面粘贴的代码,我只是修改了你的代码以更好地解释它。

你能添加你调用此方法的代码吗编辑原始问题以包含调用代码