从REST调用返回对象

我在节点上很新,所以我可能会这样做是错误的(如果我是,不要害怕说) – 我希望能够创build一个由多个不同的rest服务器并将最终的对象返回给我的调用函数。 对于每个restAPI我有一个function,看起来有点像这样:

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(等等) – 我怎样才能构build我的get_users_jobs函数只是从其余的调用返回的数据?

在此先感谢任何人可以帮助!

而不是传递一个响应给你的get_users_jobs ,传递一个callback作为第二个参数,如下所示:

 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', ...)内部的callback调用 – 这是一个典型的node.jscallback模式。 你做了同样的事情,但通过控制响应而不是你自己的function。

如果您仍然需要直接将结果传递给响应,请添加一个通过的包装函数

  function(err, response) { if (err) { console.error('error: ' + e.message); } else { onResult.send(res.statusCode, obj); } } 

作为get_users_jobscallback参数