我在节点上很新,所以我可能会犯这个错误(如果我是,不要害怕说) - 我希望能够创建一个对象由来自几个不同的休息服务器的数据组成,并将最终对象返回给我的调用函数。对于每个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函数来返回数据从休息电话?
提前感谢任何有帮助的人!
答案 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