Node.js 从REST调用返回对象

Node.js 从REST调用返回对象,node.js,express,Node.js,Express,我对node非常陌生,所以我可能完全搞错了(如果是的话,不要害怕说)——我希望能够创建一个由来自多个不同rest服务器的数据组成的对象,并将最终对象返回给我的调用函数。对于每个rest api,我都有一个类似以下的函数: exports.get_users_jobs = function(options, cb) { //... //no changes //... var reqGet = http.request(optionsget, function(re

我对node非常陌生,所以我可能完全搞错了(如果是的话,不要害怕说)——我希望能够创建一个由来自多个不同rest服务器的数据组成的对象,并将最终对象返回给我的调用函数。对于每个rest api,我都有一个类似以下的函数:

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);
  });
};
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对象中。所以我创造了一个有点像这样的东西(我现在只把工作放在里面,但很快就会有其他变量)

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函数来只从rest调用返回数据


提前感谢所有能够提供帮助的人!

不要将响应传递给您的
获取用户\u作业
,而是将回调作为第二个参数传递给它,类似于以下内容:

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回调模式。您做了同样的事情,但将控件传递给response,而不是您自己的函数

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

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

作为获取用户作业的回调参数,这正是我需要的!谢谢!(我来自java,所以回调概念对我来说有点奇怪)