Node.js 从REST调用返回对象
我对node非常陌生,所以我可能完全搞错了(如果是的话,不要害怕说)——我希望能够创建一个由来自多个不同rest服务器的数据组成的对象,并将最终对象返回给我的调用函数。对于每个rest api,我都有一个类似以下的函数: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
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,所以回调概念对我来说有点奇怪)