2017-02-11 6 views
0

저는 NodeJS에서 n00b이므로이 질문은 다소 초보적 일 수 있습니다.NodeJS + MongoJS : 중첩 콜백 문제

논리적으로 관련된 두 개의 모음을 읽으려면 MongoJS를 사용하고 있습니다. 첫 번째 find()은 내가 필요한 정보를 얻으려면 두 번째 찾기()에 전달하는 값을 반환합니다.

몇 가지 전략을 시도했습니다. 마지막으로 (스 니펫 # 1) 내가 내보내는 클래스입니다.

이전에 반환 함수을 가져 와서 원하는 값인 "config [0]"을 반환했습니다.

이 코드에서는 "sapConfig"속성을 "test"라는 단어로 설정했지만이 코드를 실행할 때 "get_config()"를 호출하면 "sapConfig"값이 항상 "null"이됩니다. 메서드 및 - 이상한 - "this.sapConfig = 'test'"에 대한 참조는 "undefined의 속성 'sapConfig'를 설정할 수 없습니다."라는 오류를 생성합니다.

난 그냥 반환 문 간단한 함수로 코드를 한 경우 ((니펫을 # 2) 오류가 발생되지 않았다하지만 반환 값은 항상 CONSOLE.LOG하지만 "정의"입니다) 문이 보여 반환되는 변수의 값이 원하는 값을 갖습니다. 뭐라 구요?

코드 조각 # 1 : 그것은 라인을 실행할 때 나는를 호출 "GET_CONFIG()"오류의 결과를 할 때 반환이, 다시

"use strict"; 

var mongojs = require('mongojs'); // MongoDB API wrapper 

module.exports = function(regKey) { 

    this.regKey = regKey; 
    this.sapConfig = null; 

    this.get_config = function() { 

     // Read SAP connection information from our MONGO db 
     var db = mongojs('mongodb://localhost/MIM', ['Configurations','Registrations']); 

     db.Registrations.find({ key: this.regKey }, function(err1, registration){ 
      console.log('Reg.find()'); 
      console.log(registration[0]); 
      db.Configurations.find({ type: registration[0].type }, function(err2, config){ 
       console.log('Config.find()'); 
       console.log('config=' + config[0].user); 
       this.sapConfig = 'test'; 
      }); 
     }); 
    } 

    this.get_result = function() { 
     return this.sapConfig; 
    } 
} 

, 조각 # 1의 코드 객체 "this.sapConfig = 'test'".

그러나이 오류가 발생하면 "obj.get_result()"를 실행할 수 있으며 초기화 된 값, 즉 null이 반환됩니다. 즉, 같은 코드는 "이것은"

코드 조각 # 2 ") (GET_CONFIG"는 .IN 같은 방법

를 정의되어 있지 않다는 오류를 생성하지 않습니다 다음 문 "반환"사용

"use strict"; 

var mongojs = require('mongojs'); // MongoDB API wrapper 

module.exports = function(regKey) { 

     // Read SAP connection information from our MONGO db 
     var db = mongojs('mongodb://localhost/MIM', ['Configurations','Registrations']); 

     db.Registrations.find({ key: regKey }, function(err1, registration){ 
      console.log('Reg.find()'); 
      console.log(registration[0]); 
      db.Configurations.find({ type: registration[0].type }, function(err2, config){ 
       console.log('Config.find()'); 
       console.log('config=' + config[0].user); 
       return config[0].user; 
      }); 
     }); 
} 

반환 값을 받고 검사하면 "정의되지 않음"입니다. 예를 들어, 노드 CL에서 나는 다음과 같은 명령을 실행

var config = require('./config') // The name of the module above 
> var k = config('2eac44bc-232d-4667-bd24-18e71879f18c') 
undefined <-- this is from MongoJS; it's fine 
> Reg.find() <-- debug statement in my function 
{ _id: 589e2bf64b0e89f233da8fbb, 
    key: '2eac44bc-232d-4667-bd24-18e71879f18c', 
    type: 'TEST' } 
Config.find() 
config=MST0025 
> k <-- this should have the value of "config[0]" 
undefined 

당신은 쿼리가 성공했음을 볼 수 있지만 "K"의 값이 "정의"입니다. 무슨 일 이니?

내가 어떤 접근 방식을 사용하든 신경 쓰지 않고 그 중 하나만 작동하면됩니다.

미리 감사드립니다.

+0

두 번째 부분에 대한 내 대답은 내 새로운 예제를 참조하십시오 :) 건배. – matt

답변

0

this.sapConfig에 액세스 할 수 없습니다. 그 이유는 this이 현재 함수 내에서 참조하기 때문입니다. 내가 뭘 좋아하는지, sapConfig이있는 것을 알고있는 함수 인스턴스를 참조하는 변수가 있습니다.

예 :

function Foo() { 
    var self = this; 

    this.test = "I am test"; 

    var bar = function(){ 
    return function(){ 
     console.log(this.test); //outputs undefined (because this refers to the current function scope) 
     console.log(self.test); //outputs "I am test"; 
    } 
    } 
} 

여기에 구현 내 예를 사용하여 첫 번째 코드 SNIPPIT입니다 : 두 번째 조각에 대한

"use strict"; 

var mongojs = require('mongojs'); // MongoDB API wrapper 

module.exports = function(regKey) { 
    var self = this; 

    this.regKey = regKey; 
    this.sapConfig = null; 

    this.get_config = function() { 

    // Read SAP connection information from our MONGO db 
    var db = mongojs('mongodb://localhost/MIM', ['Configurations', 'Registrations']); 

    db.Registrations.find({ key: this.regKey }, function(err1, registration) { 
     console.log('Reg.find()'); 
     console.log(registration[0]); 
     db.Configurations.find({ type: registration[0].type }, function(err2, config) { 
     console.log('Config.find()'); 
     console.log('config=' + config[0].user); 
     self.sapConfig = 'test'; 
     }); 
    }); 
    } 

    this.get_result = function() { 
    return self.sapConfig; 
    } 
} 

가. 중첩 된 콜백 내에서 값을 반환하려고합니다. 중첩 된 함수는 비동기 적이기 때문에 그렇게 할 수 없습니다. 내가 중첩 콜백에서 값을 반환 좋아하는 방법은 다음과

은 다음과 같습니다

EX2 :

//Function example 
var functionWithNested = function(done) { 
    //Notice the done param. 
    // It is going to be a function that takes the finished data once all our nested functions are done. 

    function() { 
    //Do things 
    function() { 
     //do more things 
     done("resultHere"); //finished. pass back the result. 
    }();//end of 2nd nested function 
    }(); //end of 1st nested function 
}; 

//Calling the function 
functionWithNested(function(result) { 
    //Callback 
    console.log(result); //resultHere 
}) 

가 여기에 그 예를 사용하여 코드 :

"use strict"; 

var mongojs = require('mongojs'); // MongoDB API wrapper 

module.exports = function(regKey, done) { 

    // Read SAP connection information from our MONGO db 
    var db = mongojs('mongodb://localhost/MIM', ['Configurations', 'Registrations']); 

    db.Registrations.find({ key: regKey }, function(err1, registration) { 
    console.log('Reg.find()'); 
    console.log(registration[0]); 
    db.Configurations.find({ type: registration[0].type }, function(err2, config) { 
     console.log('Config.find()'); 
     console.log('config=' + config[0].user); 
     done(config[0].user); 
    }); 
    }); 
} 

//Then wherever you call the above function use this format 
// if config is the name of the function export above... 

new Config().(regKey, function(result){ 

    console.log(result); //config[0].user value 
}) 

많은 코드를 많이, 그러나 당신이 그것을 따라갈 수 있었기를 바랍니다. 더 궁금한 점이 있으면 알려주세요. 건배.

+0

우수! 매력처럼 작동하고 이제는 설명 했으므로 완벽합니다. 다른 스 니펫이 '정의되지 않음'을 반환하는 이유, 즉 ** return ** 문이 예상대로 작동하지 않는 이유를 알고 계십니까? – Ishmael

+0

다행스럽게 생각합니다. 반환 문 문제 : 중첩 콜백 내에서 값을 반환 할 수 없습니다. 아예 중첩 콜백에서 내 값을 반환하는 방법에 대한 또 다른 예제를 추가하십시오. 그냥 내놔 :) – matt

+0

예! 완전한! 그것은 완전한 의미를가집니다. 나는 "비동기 적으로"생각하지 않았습니다. 우수한 정보. 정말 고맙습니다! – Ishmael