返回false是否可以通过异步函数传递ESLint一致返回错误?

时间:2017-01-05 12:21:02

标签: 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 next();
    }

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

现在,此代码提供了'一致 - 返回'错误。似乎有2个可能的更改,删除了这个错误,我不确定哪个是正确的。

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()

请告知哪种方法适合。感谢。

2 个答案:

答案 0 :(得分:6)

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

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

替换

if( err ){
  return next();
}

if( err ){
  next();
  return;
}

整个并不令人困惑的代码:

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()

答案 1 :(得分:1)

让我们稍微分析一下您的代码,并删除一些细节:

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 docs状态,函数可以返回某些内容或者什么都不返回(隐式undefined),但不能同时返回两者(这是不一致的行为);否则会引发consistent-return错误。

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