javascript - Node.js 模块错误处理

标签 javascript node.js

上周我一直在处理错误,特别是 Node.js 模块中的错误处理。首先,这是我的代码:

user.js 路由

router.post('/register', function(req, res) {
    var newUser = new User({
        firstname: req.body.firstname,
        lastname: req.body.lastname,
        email: req.body.email,
        password: req.body.password,
    });

    User.addUser(newUser, function(err, user) {
        if(err) {
            return next(err)
        } else if(user) {
            res.status(403).send('User already exists');
        } else {
            res.sendStatus(200);
        }
    });
});

user.js 模块

module.exports.addUser = function(newUser, cb) {
  User.findOne({ email: newUser.email }, function(err, user) {
    if(err) {
      cb(err);
    } else if(user) {
      cb(null, user);
    } else {
      bcrypt.genSalt(10, function(err, salt) {
        if(err) {
          cb(err);
        } else {
          bcrypt.hash(newUser.password, salt, function(err, hash) {
            if(err) {
              cb(err)
            } else {
              newUser.password = hash;

              newUser.save(function(err, newUser) {
                if(err) {
                  cb(err);
                } else {
                  cb(null, false);
                }
              });
            }
          });
        }
      });
    }
  });
}

每当user.js模块内部出现错误时,调用回调函数并处理user.js路由内部的错误。这可行,但是我的模块内的困惑看起来不太好,因为有太多 if-else 语句..

是否有更好的方法,或者我必须每次都检查是否有错误?

最佳答案

您可以将代码简化为:

module.exports.addUser = function(newUser, cb) {
  User.findOne({ email: newUser.email }, function(err, user) {
    if(err) {
      cb(err);
      return;
    } 

    if(user) {
      cb(null, user);
      return ;
    } 

    bcrypt.genSalt(10, function(err, salt) {
      if(err) {
        cb(err);
        return;
      } 

      bcrypt.hash(newUser.password, salt, function(err, hash) {
        if(err) {
          cb(err)
          return;
        } 

        newUser.password = hash;

        newUser.save(function(err, newUser) {
          if(err) {
            cb(err);
            return;
          } 

          cb(null, false);
        });
      });
    });
  });
}

但是,如果我是您,正如 @Scimonster 在他的评论中所述,这是 promises 的典型用例这将允许您编写更具可读性的代码并避免 callback hell

关于javascript - Node.js 模块错误处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48439459/

相关文章:

javascript - 这里所做的权衡是什么? (推与数组)

javascript - d3 选择类名包含字符串的元素

javascript - 使用 NodeJS 填写表格并访问网页

node.js - 如何在设计微服务时考虑到测试

JavaScript : Hosting User Images in S3 Bucket For Application

javascript - 什么相当于 Chrome 开发工具中的 Firebug DOM 选项卡?

javascript - 如何在 MySQL 值更改时播放声音

javascript - 过滤和删除数组中的过滤元素

javascript - SerialPort 没有方法 'list'

c# - 如何在 Nginx 中使用不同的端口运行 C# ASP.NET Core 2.1 和 Node.js?