Javascript 如何避免否则地狱在NodeJs,Express
我正在Nodejs和express中做一个项目,我有一个逻辑来响应ajax调用,ajax调用通过其聚合框架查询MongoDb数据库,然后处理所获得的结果 从MongoDB查询获得的结果 此查询的回调函数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});
, 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。您的答案看起来非常小且干净…我一直在寻找的是…将实现此功能并进行后续操作。非常感谢你的时间这个答案很有魅力,非常感谢。你的答案看起来很小很干净…我一直在寻找的是…将实施这个并跟进。非常感谢你的时间这个答案很有魅力,谢谢 非常感谢。