我正在使用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()
请告知哪种方法适合。感谢。
答案 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
),而在你的代码路径中,它们都返回一些内容。