node.js - 从 REST 调用返回对象

标签 node.js express

我在 Node 上还很新,所以我可能会搞错(如果我是,不要害怕说) - 我希望能够创建一个由多个数据组成的对象不同的休息服务器并将最终对象返回给我的调用函数。对于每个休息 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,获取数据并将其放入我的 uber 对象中。所以我创建了一些类似这样的东西(我现在只把工作放在那里,但很快就会有其他变量)

用户.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 函数来仅返回数据来自其余的电话?

预先感谢任何可以提供帮助的人!

最佳答案

不要将响应传递给 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', ...) 内部对回调的调用 - this是典型的node.js回调模式。您做了同样的事情,但将控制权传递给了响应而不是您自己的函数。

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

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

作为get_users_jobs的回调参数

关于node.js - 从 REST 调用返回对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24654385/

相关文章:

node.js - 如何在jade View 中只渲染一个文档?

javascript - CSS 未应用于 Pug 条件元素

javascript - Restangular 不 PUT 完整对象

javascript - Nodemailer 无法在路由文件夹中工作

javascript - ExpressJS : passing parameters to html doesn't work

http.get 通过 vpn + node

node.js - Mongoose 选择数组中的数组项

ajax - 在客户端使用 dc.js,在服务器端使用 crossfilter

node.js - nodejs、pgSQL 和异步查询

javascript - Socket.io:如果在快速路线内使用,事件会触发两次