Javascript 返回false,用异步函数传递ESLint一致返回错误,可以吗?

Javascript 返回false,用异步函数传递ESLint一致返回错误,可以吗?,javascript,node.js,express,asynchronous,eslint,Javascript,Node.js,Express,Asynchronous,Eslint,我正在使用ExpressJS,需要在代码上运行并传递ESLint规则。有一条“一致返回”规则,它是为如下代码抛出的: function getUsers( req, res, next ){ if( req.userIds.length === 0 ){ return next(); } collection.find({"_id": {$in: req.userIds}}, function( err, doc ){ if( err ){ return

我正在使用ExpressJS,需要在代码上运行并传递ESLint规则。有一条“一致返回”规则,它是为如下代码抛出的:

function getUsers( req, res, next ){
  if( req.userIds.length === 0 ){
    return next();
  }

  collection.find({"_id": {$in: req.userIds}}, function( err, doc ){
    if( err ){
      return next();
    }

    req.users = doc;
    return next();
  });//find()
}//getUsers()
现在,这段代码给出了“一致返回”错误。似乎有两种可能的改变,消除了这个错误,我不确定哪一种是正确的

function getUsers( req, res, next ){
  if( req.userIds.length === 0 ){
    return next();
  }

  collection.find({"_id": {$in: req.userIds}}, function( err, doc ){
    if( err ){
      return next();
    }

    req.users = doc;
    return next();
  });//find()

  return false; // adding return false passes the ESLint error
}//getUsers()

 function getUsers( req, res, next ){
  if( req.userIds.length === 0 ){
    return next();
  }

  // adding return in below line passes the ESLint error.
  return collection.find({"_id": {$in: req.userIds}}, function( err, doc ){
    if( err ){
      return next();
    }

    req.users = doc;
    return next();
  });//find()
}//getUsers()

请告诉我该怎么做。谢谢。

这里的规则指出了一个真正的一致性问题:有时您似乎返回一个值,有时您不返回。它只会因为返回的值被忽略而起作用。
return
语句的唯一一点是不执行函数的其余部分

这里的代码具有误导性,并且会损害可读性

替换

if( err ){
  return next();
}

整个代码不容易混淆:

function getUsers( req, res, next ){
    if( req.userIds.length === 0 ){
        next();
        return
    }
    collection.find({"_id": {$in: req.userIds}}, function( err, doc ){
        if( !err ){
            req.users = doc;
        }
        next();
    });//find()
}//getUsers()

这里的规则指出了一个真正的一致性问题:有时您似乎返回一个值,有时您不返回。它只会因为返回的值被忽略而起作用。
return
语句的唯一一点是不执行函数的其余部分

这里的代码具有误导性,并且会损害可读性

替换

if( err ){
  return next();
}

整个代码不容易混淆:

function getUsers( req, res, next ){
    if( req.userIds.length === 0 ){
        next();
        return
    }
    collection.find({"_id": {$in: req.userIds}}, function( err, doc ){
        if( !err ){
            req.users = doc;
        }
        next();
    });//find()
}//getUsers()

让我们稍微分析一下您的代码,去掉一些细节:

function getUsers( req, res, next ){

  if( req.userIds.length === 0 ){
    return next();
  }

  collection.find({"_id": {$in: req.userIds}}, function( err, doc ){
    // lotsa code here
  });

}
这里,在函数
getUsers()
中,可以有两个代码路径:错误条件(当
req.userIds
为空时)或不存在

根据是否满足错误条件,函数
getUsers()
要么返回某物(
next()
),要么什么也不返回(实际上隐式返回
undefined
)。请注意,
collection.find()
在第二种情况下执行,它本身可能会返回其中的某些内容,但是
getUsers()
不会知道

现在,作为ESLint状态,函数可以返回某物或不返回任何东西(隐式
未定义
),但不能同时返回两者(这是不一致的行为);否则将抛出一致返回
错误


因此,为了解决这个错误,Denys的代码和您自己的第二个可能的更改都将起作用。在Denys的代码中,两个代码路径都不返回任何内容(隐式
未定义
),而在您的代码中,它们都返回一些内容。

让我们稍微分析一下您的代码,去掉一些细节:

function getUsers( req, res, next ){

  if( req.userIds.length === 0 ){
    return next();
  }

  collection.find({"_id": {$in: req.userIds}}, function( err, doc ){
    // lotsa code here
  });

}
这里,在函数
getUsers()
中,可以有两个代码路径:错误条件(当
req.userIds
为空时)或不存在

根据是否满足错误条件,函数
getUsers()
要么返回某物(
next()
),要么什么也不返回(实际上隐式返回
undefined
)。请注意,
collection.find()
在第二种情况下执行,它本身可能会返回其中的某些内容,但是
getUsers()
不会知道

现在,作为ESLint状态,函数可以返回某物或不返回任何东西(隐式
未定义
),但不能同时返回两者(这是不一致的行为);否则将抛出一致返回
错误


因此,为了解决这个错误,Denys的代码和您自己的第二个可能的更改都将起作用。在Denys的代码中,两个代码路径都不返回任何内容(隐式
未定义
),而在您的代码中,它们都返回一些内容。

感谢Denys的回复。我正在尝试你的解决方案。但是
return next()
我已经在我的所有代码中使用过了。它只是可读性较差,还是还有其他严重的缺点?现在我认为除了强迫读者知道返回值被忽略以了解发生了什么之外,没有其他缺点。但是,它可能会越来越令人困惑,因为异步性越来越多地通过(返回的)承诺来处理。您的代码通过了ESLint测试。但我还是很困惑。对我来说,它应该返回错误,因为if块中的
return
语句位于find()函数的开头,而不是find()函数之后,所以我希望它返回一致的返回错误。在express中,如果需要,您可以传递它:
next(err)此链接-显示使用返回回调(err)而不是回调(err)。另外,如果我使用
next(err);返回ESLint在某些情况下显示无用的返回。如果我删除
返回然后抛出一致的返回错误。感谢Denys的回复。我正在尝试你的解决方案。但是
return next()
我已经在我的所有代码中使用过了。它只是可读性较差,还是还有其他严重的缺点?现在我认为除了强迫读者知道返回值被忽略以了解发生了什么之外,没有其他缺点。但是,它可能会越来越令人困惑,因为异步性越来越多地通过(返回的)承诺来处理。您的代码通过了ESLint测试。但我还是很困惑。对我来说,它应该返回错误,因为if块中的
return
语句位于find()函数的开头,而不是find()函数之后,所以我希望它返回一致的返回错误。在express中,如果需要,您可以传递它:
next(err)此链接-显示使用返回回调(err)而不是回调(err)。另外,如果我使用
next(err);返回ESLint在某些情况下显示无用的返回。如果我删除
返回然后抛出一致的返回错误。感谢@sayanriju的解释。这很有帮助,不客气!事实上,我自己最近刚开始使用ESLint,也遇到了完全相同的问题。谢谢@sayanriju的解释。这很有帮助,不客气!事实上,我自己最近刚开始使用ESLint,并且面临着完全相同的问题。