2014-07-09 4 views
1

저는 노드에서 꽤 새로 생겼습니다. 그래서 나는이 모든 잘못에 대해 이야기 할 것입니다. (나는 두려워하지 마십시오.) - 객체를 생성하고 싶습니다. 여러 개의 다른 나머지 서버의 데이터로 이루어지며 최종 객체를 호출 기능에 반환합니다. 각 나머지 API를 위해 나는 조금이처럼 보이는 기능이 있습니다REST 호출에서 객체 반환

jobs.js을 나는 브라우저에서 직접 전화 했어,하지만 지금은 내가하고 싶은 때 잘 작동

exports.get_users_jobs = function(options, onResult) { 

    var user = options.params.user; 

    console.log("Get jobs for user: " + user); 

    var optionsget = { 
    host: config.jobs_rest_host, 
    port: config.jobs_rest_port, 
    path: "/jobs3/user/" + user, 
    method: "GET", 
    headers: { 
     'Content-Type': 'application/json' 
    } 
    }; 

    var reqGet = http.request(optionsget, function(res) { 
    var output = ''; 

    res.setEncoding('utf-8'); 

    res.on('data', function(chunk) { 
     output += chunk; 
    }); 

    res.on('end', function() { 
     var obj = JSON.parse(output); 
     onResult.send(res.statusCode, obj); 
    }); 

    }); 

    reqGet.end(); 

    reqGet.on('error', function(e) { 
    console.error('error: ' + e.message); 
    }); 
}; 

다른 함수에서 get_users_jobs를 호출하고, 데이터를 가져 와서 내 uber 객체에 plonk하십시오. 그래서 내가 뭔가를 만든이 같은 비트 (나는 다른 변수를 지금은 거기에 작업을 넣어 만했지만, 곧있을 것입니다)

users.js

var jobs = require('./jobs.js'); 

function User (jobs) { 
    this.jobs = jobs; 
} 

User.prototype.jobs = null; 

/* lots of stuff that I don't think matters */ 

jobs_data = jobs.get_cb_users_jobs(req, res); 

var u = User(jobs_data); 

/* do lots of stuff with u like prepare reports etc */ 

그러나 일어나는 모든 여기 내 일자리 데이터는 브라우저에서 출력됩니다. (onResult.send (blah)를 가지고 있기 때문에 의미가 있습니다.) - get_users_jobs 함수를 작성하여 나머지 호출에서 데이터를 반환하는 방법은 무엇입니까?

미리 감사드립니다. 그게 도움이 될거야!

답변

2

하는 대신 get_users_jobs에 대한 응답을 전달하는, 다음과 같이 두 번째 매개 변수로 뭔가를 콜백을 전달합니다

exports.get_users_jobs = function(options, cb) { 

    //... 
    //no changes 
    //... 

    var reqGet = http.request(optionsget, function(res) { 

    var output = ''; 

    res.setEncoding('utf-8'); 

    res.on('data', function(chunk) { 
     output += chunk; 
    }); 


    res.on('end', function() { 
     var obj = JSON.parse(output); 
     cb(null, { 
      status: res.statusCode, 
      data: output 
     }); 
    }); 

    }); 

    reqGet.end(); 

    reqGet.on('error', function(e) { 
    cb(err); 
    }); 
}; 

및 다음 users.js에 :

jobs.get_cb_users_jobs(req, function(err, result) { 
    if (err) { 
     //handle the error 
    } else { 
     //do whatever you want with the result 
    } 
}); 

공지 내부 콜백에 대한 호출을 res.on('data', ...)res.on('error', ...) - 일반적인 node.js 콜백 패턴입니다. 당신도 똑같은 일을했지만 컨트롤을 자신의 기능 대신 응답으로 넘겼습니다. 여전히 응답에 직접 결과를 전달해야하는 경우

, 전달하는 래퍼 함수를 ​​추가

콜백 매개 변수로
function(err, response) { 
    if (err) { 
      console.error('error: ' + e.message); 
    } else { 
      onResult.send(res.statusCode, obj); 
    } 
} 

정확히 내가 필요로 무엇을 그

+0

get_users_jobs에! 고맙습니다! (나는 자바에서 왔기 때문에 콜백 개념이 조금 이상하다.) – Hamish

관련 문제