2013-08-22 4 views
0

이 질문은 Node.js를 사용하는 10gen MongoDB 클래스의 숙제 질문에서 비롯된 것입니다. 그러나 관계를 설명하기보다는 숙제 (Mongo에 관한 부분)를 풀어 줄 것을 요청하지는 않습니다. 두 함수 사이. session.js 파일에서,이 방법 addUser는 데이터 오브젝트 모듈 사용자에서이node.js의 콜백 사이의 관계

 users.addUser(username, password, email, function(err, user) { 
       "use strict"; 

       if (err) { 
        // this was a duplicate 
        if (err.code == '11000') { 
         errors['username_error'] = "Username already in use. Please choose another"; 
         return res.render("signup", errors); 
        } 
        // this was a different error 
        else { 
         return next(err); 
        } 
       } 

       sessions.startSession(user['_id'], function(err, session_id) { 
        "use strict"; 

        if (err) return next(err); 

        res.cookie('session', session_id); 
        return res.redirect('/welcome'); 
       }); 
      }); 

같은 users 데이터 오브젝트 모듈이라고합니다, 우리는있어이

this.addUser = function(username, password, email, callback) { 
     "use strict"; 

     // Generate password hash 
     var salt = bcrypt.genSaltSync(); 
     var password_hash = bcrypt.hashSync(password, salt); 

     // Create user document 
     var user = {'_id': username, 'password': password_hash}; 

     // Add email if set 
     if (email != "") { 
      user['email'] = email; 
     } 

     //node convention first arg to call back error, 2nd the actual data we're returning, callbackwith value if added user 
     // look in session.js file that uses the UsersDAO to get a sense of how this is being used and 
     // what type of callback is passed in.Task is to fill in code to add a user when one tries to signup 

     // TODO: hw2.3 

     callback(Error("addUser Not Yet Implemented!"), null); 

    } 

같은 기능 this.addUser있다 mongo 데이터베이스에 사용자 추가를 가능하게하는 콜백을 구현해야합니다. 나에게 그렇게 말하지 않을거야. 오히려 users.addUser 함수의 네 번째 인수는 콜백 함수 function(err, user) { }입니다. 또한 this.addUser 함수는 네 번째 매개 변수로 callback을 가지므로 users.addUser의 콜백 함수가 this.addUser?에서 실행됩니다.이 두 함수의 관계를 명확히 할 수 있습니까? 나는 기능이 완료되면 콜백이 실행되는 것을 알고 있지만, 정확히 무슨 일이 일어나고 있는지 this.addUser

+0

이 코드는 this.addUser에 전달되어 사용자가 원하는대로 성공 또는 오류를 처리 할 수 ​​있습니다. –

+1

실제로 콜백을 구현하지 않습니다. 콜백이 주어졌습니다.그것은 session.js 스 니펫'function (err, user) {..}'에 있습니다. 사용자는 DB에 사용자를 넣고 오류를 반환합니다. addUser의 마지막 줄에는'콜백 (callback) '이 주어지면 실행됩니다. 콜백 서명이 어떻게 생겼는지 어떻게 알 수 있습니까? 우리가 session.js에서 기대하는 것을 보아서. 희망이 도움이 될까요? – Tony

답변

1

so the callback function from users.addUser runs inside this.addUser?

로 전달되는 왜 모르겠어요. 이미 알고 있듯이 Javascript는 함수를 first-class citizens으로 취급합니다. 즉, 다른 유형과 마찬가지로 전달하고 반환 할 수 있습니다. 함수는 프로토 타입에 두 개의 추가 필드 (실행 컨텍스트와 함수 코드)가 있기 때문에 특별합니다. - 라인 users.addUser(username, password, email, function(err, user) {...}에, 당신은 네 번째 매개 변수는 익명 함수인과 this.addUser를 호출
1 : 경우

, 여기이 작동하는 방법이다.
콜백이라고하는이 익명의 함수에 변수 이름을 할당합니다.
3- 오류의 경우 오류 개체 Error("addUser Not Yet Implemented!")null을 매개 변수로 사용하여 콜백이 실행됩니다 (함수이므로). 이것들은 첫 줄에 erruser을 나타냅니다. 당신은 아마 잘 알고있는


예는 setTimeout의입니다. This function은 다음과 같이 정의됩니다. var timeoutID = window.setTimeout(func, delay, [param1, param2, ...]);. setTimeout 메서드는 실제로 func이 무엇인지 신경 쓰지는 않습니다. 예를 들어, 다음의 코드를 가정 :

여기
var delay = 30 * 1000; 
document.getElementById("foo").innerHTML = "This text will change in "+delay/1000+" sec"; 
setTimeout(function(){ 
    document.getElementById("foo").innerHTML = "told ya!"; 
}, delay); 

가, 다시, 우리는 콜백을 전달, 즉이 미래에 실행됩니다. 하나의 멋진 점은이 콜백이 setTimeout의 범위에 액세스 할 수 있다는 것입니다. 즉, 해당 범위에 정의 된 변수를 사용할 수 있습니다. setTimeout의 경우 이것은 실제로 유용하지는 않지만 사용자의 this.addUser에는 작성 조작에서 비롯된 오류 오브젝트에 대한 액세스 권한이 있습니다.

콜백 작동 방법에 대한 자세한 내용은 twoanswers을 확인하십시오.

+0

이 오류가 발생했습니다. 이에 대한 아이디어는 제공된 콜백없이 writeConcern을 사용할 수 없습니다. – niran