如何让我的代码更清晰

时间:2014-11-29 12:46:40

标签: javascript node.js mongodb express

该代码用于处理Expressjs和mongodb

中的POST请求
router.post('/', function(req, res){
  var data = req.body;
  Tag.find({name: data.name}).limit(1).exec( function(err, result){
    if(err){
    } else {
      if(result.length > 0){ // Already exist a tag with same name
        res.status(400).end('Already exist!');
      } else { // Save the new Tag to database
        var tag = new Tag();
        tag.name = data.name;
        tag.lastModifier = req.user?req.user.username:"system";
        tag.lastModified = Date.now();
        tag.save(function(err){
          if(err){
            res.status(400).json({ 
              message: "insert tag error"
            });
          } else {
            Tag.findOne(tag, function(err, result){
              if(err){          
                res.status(400).json({
                  message: "some error.."
                });
              } else {
                //res.status(400).end('same tag name');
                res.status(201).json({
                  _id: result._id
                });          
              }
            });
          }
        });
      }
    }
  });
});

最后9行中的楼梯太可怕了......请教我怎样才能让这个混乱更清楚?

4 个答案:

答案 0 :(得分:1)

您可以使用命名函数而不是某些函数表达式:

router.post('/', function(req, res){
  var data = req.body;
  Tag.find({name: data.name}).limit(1).exec( function(err, result){
    if(err){
    } else {
      if(result.length > 0){ // Already exist a tag with same name
        res.status(400).end('Already exist!');
      } else { // Save the new Tag to database
        var tag = new Tag();
        tag.name = data.name;
        tag.lastModifier = req.user?req.user.username:"system";
        tag.lastModified = Date.now();
        tag.save(save(err));
      }
    }
  });
});

function save(err){
  if(err){
    res.status(400).json({ 
      message: "insert tag error"
    });
  } else {
    Tag.findOne(tag, handleResult(err, result));
  }
}

function handleResult(err, result){
  if(err){          
    res.status(400).json({
      message: "some error.."
    });
  } else {
    //res.status(400).end('same tag name');
    res.status(201).json({
      _id: result._id
    });          
  }
}

(你可以确定它们更适合这种情况,但它显示了原则。)

答案 1 :(得分:1)

router.post('/', function(req, res){
  var data = req.body;
  Tag.find({name: data.name}).limit(1).exec(cbExec);
});


function cbExec(err, result){
    if(err){
    } else {
        if(result.length > 0){ // Already exist a tag with same name
            res.status(400).end('Already exist!');
        } else { // Save the new Tag to database
            var tag = new Tag();
            tag.name = data.name;
            tag.lastModifier = req.user?req.user.username:"system";
            tag.lastModified = Date.now();
            tag.save(cbSave);
        }
    }
}

function cbSave(err){
    if(err){
        res.status(400).json({message: "insert tag error"});
    } else {
        Tag.findOne(tag, cbTag);
    }
}

function cbTag(err, result){
    if(err){        
        res.status(400).json({message: "some error.."});
    } else {
        //res.status(400).end('same tag name');
        res.status(201).json({_id: result._id});          
    }
}

答案 2 :(得分:0)

我真的建议你尝试承诺。有许多可用于JavaScript和Node.js的实现。

一个promise基本上将异步操作封装到一个值中,这允许你摆脱这些可怕的嵌套回调。它们还允许您更轻松地链接异步操作。

您在基于回调的代码中被迫执行的操作是检查每个级别的错误,如果您的错误处理可能位于一个位置,则会变得相当繁琐。 Promise会传播错误,允许在一个地方轻松处理。

以下是一些参考资料:

调整使用它们可能需要一段时间,但相信我,绝对值得。

答案 3 :(得分:0)

你可以将鳕鱼分开一点点。而不是创建lambda函数创建正常的函数。你可以在第4行摆脱一对括号 if(err){ } else {

使用if(!err)