Node.js 结果对象在赋值时返回为未定义
我正在创建一个results对象来返回一个布尔值和一个字符串。没有在if语句中重新分配它。其余代码工作正常,密码得到更新,或者正确的错误消息被输出到控制台 在尝试捕捉之前,我已尝试保留未定义的结果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
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:我没有测试上面粘贴的代码,我只是修改了你的代码以更好地解释它。你能添加你调用此方法的代码吗编辑原始问题以包含调用代码