从REST调用返回对象

时间:2014-07-09 12:58:19

标签: node.js express

我在节点上很新,所以我可能会犯这个错误(如果我是,不要害怕说) - 我希望能够创建一个对象由来自几个不同的休息服务器的数据组成,并将最终对象返回给我的调用函数。对于每个rest api,我有一个看起来有点像这样的函数:

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,获取数据并将其插入到我的超级对象中。所以我创造了一些类似的东西(我现在只把工作放在那里,但很快就会有其他变量)

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函数来返回数据从休息电话?

提前感谢任何有帮助的人!

1 个答案:

答案 0 :(得分: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

的回调参数