2013-09-01 4 views
0

에 소정의 콜백 함수에 변수를 전달하도록 socket.io는 사용자에 대한 확인을하여 MongoDB) (onRegister 호출된다. 그러나 DB 콜백 함수가 어떻게 '이'(ioHandle)는 콜백 매개 변수에 추가 할 수있는 미리 정의인가? 방법 Node.js를 사용 Node.js를

function onRegister(data) { 
    var name,pass,room; 
    name = data.name; 
    pass = data.pass; 
    ioHandle = this; 

    Mongo.connect('mongodb://127.0.0.1:27017/main', function(err, db, ioHandle) { // wrong 
     if(err) throw err; 
     var collection = db.collection('users'); 

     // does user exist 
     collection.findOne({name : name}, function(err, doc, ioHandle) { // wrong 
      if(err) throw err; 
      if(doc) { 
       log("User already exists"); 
       ioHandle.emit(NGC_REGISTER_RESULT, {NGC_REJECT:"User already Exists"}); // ioHandle undefined 
      } else { 
       // create new user 
       log("User not found"); 
       ioHandle.emit(NGC_REGISTER_RESULT, NGC_ACCEPT); // ioHandle undefined 
      } 
      db.close(); 
     }); 
    }); 
} 

오류 : ioHandle는 ioHandle 정상 자바 스크립트 폐쇄 역학을 통해 해당 기능의 범위에있을 것입니다,

TypeError: Cannot call method 'emit' of undefined 

답변

0

당신은 findOne 콜백 함수에 ioHandle를 추가 할 필요가 없습니다 전달되지 않는 :

function onRegister(data) { 
    // ioHandle will be visible to everything inside this function, 
    // that includes the callback and nested callback below. 
    var ioHandle = this; 
    //... 

    Mongo.connect('mongodb://127.0.0.1:27017/main', function(err, db) { 
     //... 
     collection.findOne({name : name}, function(err, doc) { 
      // Use ioHandle as normal in here 
      //... 

MDN closures page에는 약간의 시간을 할애 할 수 있습니다.

+0

아, 나는 폐쇄 자습서를 통해가는 시간을 보냈다, 그리고 마지막으로 (함수() ...) (ioHandle)에 Mongo.connect을 동봉 - 일, 그래서 나는 그때 그것을 당신 덕분에 발견, 무언가를 배웠다 내가 ioHandle 앞에 'var'이 있으면 자연스럽게 둘러싸여있을 것입니다. 죄송합니다. - 건배! – ChrisAdmin