Node.js Mongoose 使用 bcrypt 登录
Posted
技术标签:
【中文标题】Node.js Mongoose 使用 bcrypt 登录【英文标题】:Node.js Mongoose Login with bcrypt 【发布时间】:2021-12-12 23:03:29 【问题描述】:所以,我正在使用 Mongoose 和 Node.js 创建登录功能。输入错误密码时出现错误的地方。
这是我收到的错误回复:
状态:0, 消息代码:421, 消息:错误, 响应数据:
我不知道为什么,但是对于密码错误的情况,我没有收到正确的错误
状态:0, 消息代码:420, 消息:'无效的凭据', 响应数据:
这是我的代码:
控制器:
module.exports.login = (req, res) =>
var user =
email: req.body.email,
password: req.body.password
;
var rules =
email: 'required|email',
password: 'required'
;
Validator(user, rules, , (err, status) =>
if (!status)
res.json(
status: 0,
msgCode: 412,
message: 'Validation failed',
responseData: err
);
else
userModel.login(user).then(dbResponse =>
if (dbResponse.email != null)
jwt.sign(user, key.secret, expiresIn: 600000 , (error, token) =>
if (error)
res.json(
status: 0,
msgCode: 418,
message: error,
responseData:
);
else
res.status(200).json(
status: 1,
message: 'Login successful',
responseData: token: token, userData: dbResponse
);
);
else
res.json(
status: 0,
msgCode: 420,
message: 'Invalid credentials',
responseData:
);
).catch((error) =>
res.json(
status: 0,
msgCode: 421,
message: error,
responseData:
);
);
);
型号:
module.exports.login = (user) =>
return new Promise((resolve, reject) =>
userModel.findOne( email: user.email , (error, row) =>
if (row)
if ( bcrypt.compareSync(user.password, row.password) )
resolve(row);
else
reject(error);
else
reject(error);
);
);
请帮忙。谢谢
【问题讨论】:
还有....你的问题是什么?!我们应该在哪里帮助您? @Marc 实际上,当我插入错误的凭据时,我希望得到以下响应 --> status: 0, msgCode: 420, message: 'Invalid credentials', responseData: 在这两种情况下都是电子邮件错误,以及密码错误时。因此,当我使用 promise 拒绝时,控制器会捕获错误并给我以下响应 --> status: 0, msgCode: 421, message: error, responseData: 【参考方案1】:正如answer from Lzok 已经说过的那样,因为如果userModel.login(user)
函数中的密码不匹配,您会拒绝promise,所以将始终执行catch 块并且执行将永远不会到达带有msgCode 420 的res.json
语句
快速的解决方案是像这样修改login
函数:
module.exports.login = (user) =>
return new Promise((resolve, reject) =>
userModel.findOne( email: user.email , (error, row) =>
if (row)
if ( bcrypt.compareSync(user.password, row.password) )
resolve(row);
else
resolve( email: null );
else
reject(error);
);
);
但最好用undefined
解决:
module.exports.login = (user) =>
return new Promise((resolve, reject) =>
userModel.findOne( email: user.email , (error, row) =>
if (row)
if ( bcrypt.compareSync(user.password, row.password) )
resolve(row);
else
resolve(undefined);
else
reject(error);
);
);
并更新then
块中的 if 语句:
if (dbResponse !== undefined && dbResponse.email !== null)
jwt.sign(user, key.secret, expiresIn: 600000 , (error, token) =>
if (error)
【讨论】:
【参考方案2】:那是因为这条线 userModel.login(user).then(...).catch(...)
正在从您的模型的 login
方法中捕获错误。不管哪个拒绝,都被捕获在这个捕获中。
也许您可以在那里使用类型错误并在原始捕获中检查它,例如:
userModel.login(user).then(...).catch((error) =>
if (error.type === 'invalid_credentials')
res.json(
status: 0,
msgCode: 420,
message: 'Invalid credentials',
responseData:
);
// Maybe another handles you want here. Or return the default error
res.json(
status: 0,
msgCode: 421,
message: error,
responseData:
);
);
【讨论】:
以上是关于Node.js Mongoose 使用 bcrypt 登录的主要内容,如果未能解决你的问题,请参考以下文章
node.js + express.js:使用 mongodb/mongoose 处理会话
Mongoose(node.js 模块)导致 CPU 使用率高
Mongoose(node.js 模块)导致 CPU 使用率高
Mongoose(node.js 模块)导致 CPU 使用率高