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 使用率高

Mongoose(node.js 模块)导致 CPU 使用率高

Mongoose(node.js 模块)导致 CPU 使用率高