2017-01-05 2 views
0

저는 ExpressJS를 사용하고 있으며 코드를 실행하고 ESLint 규칙을 전달해야했습니다. 다음과 같은 코드에 대해 throw되는 "consistent-return"규칙이 있습니다.비동기 함수의 ESLint 일관 반환 오류를 전달하려면 false를 반환해도 괜찮습니까?

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

이제이 코드는 'consistent-return'오류를 표시합니다. 이 오류를 제거하는 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() 

그것에 대해 갈 수있는 올바른 방법이다 알려 주시기 바랍니다. 감사.

답변

4

여기에있는 규칙은 실제 일관성 문제를 나타냅니다. 때로는 값을 반환하는 것처럼 보이기도하고 그렇지 않은 경우도 있습니다. 반환 된 값이 무시되기 때문에 작동합니다. return 구문의 유일한 포인트는 나머지 기능을 실행하지 않는 것입니다.

여기의 코드는 오해의 소지가 있으며 가독성이 떨어집니다.

교체

if(err){ 
    next(); 
    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() 
+0

답장을 보내 주셔서 감사합니다. 나는 당신의 해결책을 시도하고 있습니다. 그러나'return next()'는 이미 모든 코드에서 사용했습니다. 읽기 쉽지 않거나 다른 심각한 단점이 있습니까? –

+0

지금 당장 나는 독자가 반환 된 값이 무엇이 일어 났는지 이해하기 위해 무시된다는 것을 알게하는 것보다 다른 단점이있을 수 있다고 생각하지 않는다. 하지만 비동기 성이 점점 더 많은 약속 (반환)으로 처리되면서 점점 더 혼란 스러울 수 있습니다. –

+0

확인. 코드가 ESLint 테스트를 통과했습니다. 하지만 여전히 나 혼란 스럽다.나에게 그것은 오류를 반환해야한다. 왜냐하면 우리는 find() 함수 이후가 아니라 if 블록에'return' 문을 가지고 있기 때문에 일관된 반환 오류를 반환 할 것이라고 기대했을 것이다. –

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) 귀하의 경우 모두 반환합니다.

+0

@sayanriju 설명 주셔서 감사합니다. 그것은 매우 도움이됩니다. –

+1

당신은 오신 것을 환영합니다! 실제로, 나 자신은 최근에 ESLint로 시작했고 똑같은 문제에 직면 해왔다. – sayanriju