2016-09-03 1 views
0

Express를 통해 Node를 발견했습니다 (사용했던 Meteor 대신). 그리고 함수 아래 .. 비동기 일의 종류에 의해 데이터베이스를 읽은 후에 만 ​​스위치의 '대소 문자'를 선택하십시오.

을 궁지하고) (스위치로

function isAuthorized(x) { 

     // Connect to database when Bq. receives a message 
     mongoClient.connect(process.env.MONGO, function (err, db) { 

      if (err) { 
       console.log('Unable to connect to the mongoDB server') 
      } else { 
       console.log('Connection established') 
       let Users = db.collection('users') 
       Users.find({_id: From}).toArray(function (err, result) { 
        if (err) { console.log(err) } 
        else if (result.length) { 
         console.log("found"); 
         // switch (true) { 
         //  case x == null && result.authorization == null : return true 
         //  break ; 
         //  case x == false && result.authorization == false : return true 
         //  break ; 
         //  case x == true && result.authorization == true : return true 
         //  break ; 
         //  default: return false 
         //} // end of switch() 
        } 
        else { 
         console.log("does not exist"); 
         if (x == 'unknown user') { console.log("return true"); return true } 
        } 
        db.close() 
       }) 
      } 
     }) 
    } // end of isAuthorized() 

이 함수가 호출된다 (A 몽고 수집을 읽을 수 있습니다).

switch (true) { 

     case isAuthorized('unknown user') : something 
     case XYZ 
     case ABC 
     Default: console.log("default") 
} 

문제이다 스위치()가 isAuthorized() 함수가 끝나기 전에 불. 따라서 switch()는 isAuthorized ('unknown user') == true 대신 default case를 실행합니다. 함수가 데이터베이스를 읽을 때까지 기다리지 않는 것처럼 보입니다. ...

switch()가 함수의 끝을 기다리는 것을 어떻게 할 수 있습니까?

콜백에 대해 들었습니다. 비동기지만,이 모든 것을 명확한 순서로 정렬 할 수는 없습니다. 간단한 아이디어/도움이 필요하십니까?

대단히 감사합니다.

답변

1

코드가 현재 구성되는 방법 짧은 대답이 할 수 없습니다. 참조 async & await

긴 대답

이미 언급했듯이, 당신은 콜백을 사용할 필요가 것입니다. 예제에서 사용자가 먼저 권한이 부여되었는지 확인한 다음 switch 문을 실행해야합니다.

의사 코드 :

function isAuthorized(user, callback) { 

    // Run your mongoDB logic 
    mongoClient.connect(process.env.MONGO, function (err, db) { 
     Users.find({ _id: From }).toArray(function (err, result) { 
      var authorized = ...check if user is authorized... 
      db.close(); 
      callback(authorized); 
     }); 
    }); 
} 

하고 그런 식으로 그것을 사용 :

isAuthorized(yourUser, function (authorized) { 
    if (authorized) { 
     // business logic 
    } 
}); 

나는이 당신을 위해 몇 가지를 지 웁니다 바랍니다.

+0

답장을 보내 주셔서 감사합니다. 그러나 나는 약속을 사용하여 다른 방향으로 나아 갔다. 내 스위치를 실행하기 전에 실행해야하는 기능은'promise (resolve, reject)'이고 내 스위치는'promise.all (...). 그때 (..'트릭을 했어. 그것이 유효한 일의 방법인지 아십시오 ... – nerotulip

관련 문제