2014-07-09 72 views
1

我在節點上很新,所以我可能會談論這一切都是錯誤的(如果我是,不要害怕說) - 我希望能夠創建一個對象由來自幾個不同的休息服務器的數據組成,並將最終對象返回給我的調用函數。對於每一個REST 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,將數據和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(等等) - 我怎樣才能構建我的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); 
    } 
} 

回調參數get_users_jobs

+0

這正是我所需要的!謝謝! (我來自java,所以回調概念對我來說有點奇怪) – Hamish