Javascript 如何避免否则地狱在NodeJs,Express

Javascript 如何避免否则地狱在NodeJs,Express,javascript,node.js,express,Javascript,Node.js,Express,我正在Nodejs和express中做一个项目,我有一个逻辑来响应ajax调用,ajax调用通过其聚合框架查询MongoDb数据库,然后处理所获得的结果 从MongoDB查询获得的结果 此查询的回调函数 , function (err, counts) { if(err){ console.log(err); return res.json({status:false, msg : err});

我正在Nodejs和express中做一个项目,我有一个逻辑来响应ajax调用,ajax调用通过其聚合框架查询MongoDb数据库,然后处理所获得的结果

从MongoDB查询获得的结果

此查询的回调函数

, function (err, counts) {
              if(err){
                console.log(err);
                return res.json({status:false, msg : err});
              }
              if(counts){
                console.log(counts);
                for (var i = 0; i < counts.length; i++) {
                    var type = counts[i]._id;
                    var count = counts[i].count;
                    if(type == "ALR"){
                      if(count < 5){
                        return res.json({status:false, msg : "Minimum 5 All-Rounders"});
                      } 
                    } else if(type == "BAT"){
                      if(count < 6){
                        return res.json({status:false, msg : "Minimum 6 Batsman"});
                      } 
                    } else if (type == "BWL"){
                      if(count < 6){
                        return res.json({status:false, msg : "Minimum 6 Bowlers"});
                      } 
                    } else if(type == "WTK"){
                      if(count < 3){
                        return res.json({status:false, msg : "Minimum 3 Wicket Keepers"});
                      } 
                    }
                } 
                return res.json({status:true, msg : "Squad Lauched"});
              }
          });
看起来我好像陷入了一种“如果要不然”的地狱,这段代码按预期工作,但如果有人至少能给出一个以更好的方式执行此回调函数的提示,我对此并不满意。

简单。您可以使用switch case而不是多个if-else语句。

简单。您可以使用switch-case而不是多个if-else语句。

除了switch-case之外,您可以做的事情不多

但是,您可以这样剪切一些代码:

当您检查错误时,如果返回错误; 代码块将停止执行。因此,您不必检查if计数。相反,只需继续编写代码

例如:

function (err, counts) {
              if(err){
                console.log(err);
                return res.json({status:false, msg : err});
              }
              if(counts){ //remove this if. Not needed
                console.log(counts);
                for (var i = 0; i < counts.length; i++) {
变成

  function (err, counts) {
                  if(err){
                    console.log(err);
                    return res.json({status:false, msg : err});
                  }

                    console.log(counts);
                    for (var i = 0; i < counts.length; i++) 
对于for循环内部的语句也可以这样做,也可以将嵌套语句与其父语句放在一起,如下所示:

for (var i = 0; i < counts.length; i++) {
    var type = counts[i]._id;
    var count = counts[i].count;
    if(type == "ALR" && count < 5){
        return res.json({status:false, msg : "Minimum 5 All-Rounders"});
    } 
    if(type == "BAT" && count < 6){
        return res.json({status:false, msg : "Minimum 6 Batsman"});
    } 
    if (type == "BWL" && count < 6){
        return res.json({status:false, msg : "Minimum 6 Bowlers"});
    }
    if(type == "WTK" && count < 3){
        return res.json({status:false, msg : "Minimum 3 Wicket Keepers"});
    } 
} 
const squadTypeResolvers = new Map();
squadTypeResolvers.set('ALR', { 
  name: 'All-Rounders',
  minCount: 3,
});
squadTypeResolvers.set('BAT', { 
  name: 'Batsman',
  minCount: 6,
});
squadTypeResolvers.set('BWL', { 
  name: 'Bowlers',
  minCount: 6,
});
squadTypeResolvers.set('WTK', { 
  name: 'Wicket Keepers',
  minCount: 3,
});

function handleErrors(err, counts) {
  if(err){
    return res.json({status:false, msg : err});
  }
  if(counts){
    const errorMessages = [];
    counts.forEach((count) => {
      const squadMember = squadTypeResolvers.get(count._id);
      if (count.count < squadMember.minCount) {
        errorMessages.push('Minimum ' + squadMember.minCount + ' ' + squadMember.name);
      }
    });

    if (errorMessages.length > 0) {
      return res.json({
        status: false,
        msg: errorMessages.join('; '),
      });
    } else {
      return res.json({status:true, msg : "Squad Lauched"});
    }
  }
}
除了开关箱,你没什么办法

但是,您可以这样剪切一些代码:

当您检查错误时,如果返回错误; 代码块将停止执行。因此,您不必检查if计数。相反,只需继续编写代码

例如:

function (err, counts) {
              if(err){
                console.log(err);
                return res.json({status:false, msg : err});
              }
              if(counts){ //remove this if. Not needed
                console.log(counts);
                for (var i = 0; i < counts.length; i++) {
变成

  function (err, counts) {
                  if(err){
                    console.log(err);
                    return res.json({status:false, msg : err});
                  }

                    console.log(counts);
                    for (var i = 0; i < counts.length; i++) 
对于for循环内部的语句也可以这样做,也可以将嵌套语句与其父语句放在一起,如下所示:

for (var i = 0; i < counts.length; i++) {
    var type = counts[i]._id;
    var count = counts[i].count;
    if(type == "ALR" && count < 5){
        return res.json({status:false, msg : "Minimum 5 All-Rounders"});
    } 
    if(type == "BAT" && count < 6){
        return res.json({status:false, msg : "Minimum 6 Batsman"});
    } 
    if (type == "BWL" && count < 6){
        return res.json({status:false, msg : "Minimum 6 Bowlers"});
    }
    if(type == "WTK" && count < 3){
        return res.json({status:false, msg : "Minimum 3 Wicket Keepers"});
    } 
} 
const squadTypeResolvers = new Map();
squadTypeResolvers.set('ALR', { 
  name: 'All-Rounders',
  minCount: 3,
});
squadTypeResolvers.set('BAT', { 
  name: 'Batsman',
  minCount: 6,
});
squadTypeResolvers.set('BWL', { 
  name: 'Bowlers',
  minCount: 6,
});
squadTypeResolvers.set('WTK', { 
  name: 'Wicket Keepers',
  minCount: 3,
});

function handleErrors(err, counts) {
  if(err){
    return res.json({status:false, msg : err});
  }
  if(counts){
    const errorMessages = [];
    counts.forEach((count) => {
      const squadMember = squadTypeResolvers.get(count._id);
      if (count.count < squadMember.minCount) {
        errorMessages.push('Minimum ' + squadMember.minCount + ' ' + squadMember.name);
      }
    });

    if (errorMessages.length > 0) {
      return res.json({
        status: false,
        msg: errorMessages.join('; '),
      });
    } else {
      return res.json({status:true, msg : "Squad Lauched"});
    }
  }
}

因为您选择了从所有路径返回,这些路径识别数据的故障,所以您不需要使用大多数else语句,只需继续执行后续的if即可

您正在为每个if执行两个测试,这些if可以连接成一个带有2个条件和一个布尔值的检查

当没有数据时,代码不会处理这种情况。考虑到您的多重回报方法,您可以将其放在第一位,然后删除另一层嵌套

function (err, counts) {
    if(err){
        console.log(err);
        return res.json({status:false, msg : err});
    }

    if(!counts) {
        // only guessing at what you'd want to return here
        return res.json({status:false, msg : "There was no squad!"});
    }

    console.log(counts);
    for (var i = 0; i < counts.length; i++) {
        var type = counts[i]._id;
        var count = counts[i].count;

        if(type == "ALR" && count < 5){
            return res.json({status:false, msg : "Minimum 5 All-Rounders"});
        } 

        if(type == "BAT" && count < 6){
            return res.json({status:false, msg : "Minimum 6 Batsman"});
        } 

        if (type == "BWL" && count < 6){
            return res.json({status:false, msg : "Minimum 6 Bowlers"});
        } 

        if(type == "WTK" && count < 3){
            return res.json({status:false, msg : "Minimum 3 Wicket Keepers"});
        } 
    } 

    return res.json({status:true, msg : "Squad Lauched"});
}

因为您选择了从所有路径返回,这些路径识别数据的故障,所以您不需要使用大多数else语句,只需继续执行后续的if即可

您正在为每个if执行两个测试,这些if可以连接成一个带有2个条件和一个布尔值的检查

当没有数据时,代码不会处理这种情况。考虑到您的多重回报方法,您可以将其放在第一位,然后删除另一层嵌套

function (err, counts) {
    if(err){
        console.log(err);
        return res.json({status:false, msg : err});
    }

    if(!counts) {
        // only guessing at what you'd want to return here
        return res.json({status:false, msg : "There was no squad!"});
    }

    console.log(counts);
    for (var i = 0; i < counts.length; i++) {
        var type = counts[i]._id;
        var count = counts[i].count;

        if(type == "ALR" && count < 5){
            return res.json({status:false, msg : "Minimum 5 All-Rounders"});
        } 

        if(type == "BAT" && count < 6){
            return res.json({status:false, msg : "Minimum 6 Batsman"});
        } 

        if (type == "BWL" && count < 6){
            return res.json({status:false, msg : "Minimum 6 Bowlers"});
        } 

        if(type == "WTK" && count < 3){
            return res.json({status:false, msg : "Minimum 3 Wicket Keepers"});
        } 
    } 

    return res.json({status:true, msg : "Squad Lauched"});
}

您的代码显然非常重复。一种改变的方法是用必要的数据创建一个对象,并在此基础上执行程序逻辑。例如:

var types = {
  ALR: { min: 5, name: 'All-Rounders' },
  BAT: { min: 5, name: 'Batsman' },
  BWL: { min: 4, name: 'Bowlers' },
  WTK: { min: 3, name: 'Wicket Keepers' },
};

for (var i = 0; i < counts.length; i++) {
  var type = counts[i]._id;
  var count = counts[i].count;
  if (types[type] && count < types[type].min) {
    return res.json({ status: false, msg: 'Minimum ' + types[type].min + ' ' + types[type].name });
  }
}

您的代码显然非常重复。一种改变的方法是用必要的数据创建一个对象,并在此基础上执行程序逻辑。例如:

var types = {
  ALR: { min: 5, name: 'All-Rounders' },
  BAT: { min: 5, name: 'Batsman' },
  BWL: { min: 4, name: 'Bowlers' },
  WTK: { min: 3, name: 'Wicket Keepers' },
};

for (var i = 0; i < counts.length; i++) {
  var type = counts[i]._id;
  var count = counts[i].count;
  if (types[type] && count < types[type].min) {
    return res.json({ status: false, msg: 'Minimum ' + types[type].min + ' ' + types[type].name });
  }
}

我会这样解决它:

for (var i = 0; i < counts.length; i++) {
    var type = counts[i]._id;
    var count = counts[i].count;
    if(type == "ALR" && count < 5){
        return res.json({status:false, msg : "Minimum 5 All-Rounders"});
    } 
    if(type == "BAT" && count < 6){
        return res.json({status:false, msg : "Minimum 6 Batsman"});
    } 
    if (type == "BWL" && count < 6){
        return res.json({status:false, msg : "Minimum 6 Bowlers"});
    }
    if(type == "WTK" && count < 3){
        return res.json({status:false, msg : "Minimum 3 Wicket Keepers"});
    } 
} 
const squadTypeResolvers = new Map();
squadTypeResolvers.set('ALR', { 
  name: 'All-Rounders',
  minCount: 3,
});
squadTypeResolvers.set('BAT', { 
  name: 'Batsman',
  minCount: 6,
});
squadTypeResolvers.set('BWL', { 
  name: 'Bowlers',
  minCount: 6,
});
squadTypeResolvers.set('WTK', { 
  name: 'Wicket Keepers',
  minCount: 3,
});

function handleErrors(err, counts) {
  if(err){
    return res.json({status:false, msg : err});
  }
  if(counts){
    const errorMessages = [];
    counts.forEach((count) => {
      const squadMember = squadTypeResolvers.get(count._id);
      if (count.count < squadMember.minCount) {
        errorMessages.push('Minimum ' + squadMember.minCount + ' ' + squadMember.name);
      }
    });

    if (errorMessages.length > 0) {
      return res.json({
        status: false,
        msg: errorMessages.join('; '),
      });
    } else {
      return res.json({status:true, msg : "Squad Lauched"});
    }
  }
}

或者,您可以将错误消息数组作为json中的数组传递,以便将所有错误方便地传递给用户/消费者

for (var i = 0; i < counts.length; i++) {
    var type = counts[i]._id;
    var count = counts[i].count;
    if(type == "ALR" && count < 5){
        return res.json({status:false, msg : "Minimum 5 All-Rounders"});
    } 
    if(type == "BAT" && count < 6){
        return res.json({status:false, msg : "Minimum 6 Batsman"});
    } 
    if (type == "BWL" && count < 6){
        return res.json({status:false, msg : "Minimum 6 Bowlers"});
    }
    if(type == "WTK" && count < 3){
        return res.json({status:false, msg : "Minimum 3 Wicket Keepers"});
    } 
} 
const squadTypeResolvers = new Map();
squadTypeResolvers.set('ALR', { 
  name: 'All-Rounders',
  minCount: 3,
});
squadTypeResolvers.set('BAT', { 
  name: 'Batsman',
  minCount: 6,
});
squadTypeResolvers.set('BWL', { 
  name: 'Bowlers',
  minCount: 6,
});
squadTypeResolvers.set('WTK', { 
  name: 'Wicket Keepers',
  minCount: 3,
});

function handleErrors(err, counts) {
  if(err){
    return res.json({status:false, msg : err});
  }
  if(counts){
    const errorMessages = [];
    counts.forEach((count) => {
      const squadMember = squadTypeResolvers.get(count._id);
      if (count.count < squadMember.minCount) {
        errorMessages.push('Minimum ' + squadMember.minCount + ' ' + squadMember.name);
      }
    });

    if (errorMessages.length > 0) {
      return res.json({
        status: false,
        msg: errorMessages.join('; '),
      });
    } else {
      return res.json({status:true, msg : "Squad Lauched"});
    }
  }
}

或者,您可以将错误消息数组作为json中的数组传递,以便将所有错误方便地传递给用户/消费者

不要忘记进行投票或验证答案。这可能对其他人也有用@GauravKumarDon't know@VietPhan可能是一些随机的人,personI给出了一行简单的代码,因为在switch case中重写上面的代码没有意义……但是如果你有,你会注意到switch/case并没有使代码变得更好:它会让代码更可读。Switch是多个if-else语句的一个很好的替代方案,但不要忘记向上投票或验证答案。这可能对其他人也有用@GauravKumarDon't know@VietPhan可能是一些随机的人,personI给出了一行简单的代码,因为在switch case中重写上面的代码没有意义……但是如果你有,你会注意到switch/case并没有使代码变得更好:它会让代码更可读。Switch是多个if-else语句的一个很好的选择。与其他答案一样,我的答案中没有Switch,因为它只允许您对单个值做出反应,而您的所有条件都基于两个值。因此,您的代码不适合切换,因为在每个情况下您仍然需要if。与其他答案不同,我的代码中没有切换,因为它只允许您对单个值做出反应,而您的所有条件都基于2个值。因此,您的代码不适合切换,因为您仍然需要在每个案例中使用if。您的答案看起来非常小且干净…我一直在寻找的是…将实现此功能并进行后续操作。非常感谢你的时间这个答案很有魅力,非常感谢。你的答案看起来很小很干净…我一直在寻找的是…将实施这个并跟进。非常感谢你的时间这个答案很有魅力,谢谢 非常感谢。