Node.js 将HTTP请求导出为模块功能节点.js
我已尝试(成功)执行http请求。我有一些RESTAPI,比如graph.facebook.com作为目标。功能是相同的。当我用node.js作为一个简单的程序发出HTTP请求时,我可以做到。 我真的想做一个小模块,我有以下代码:Node.js 将HTTP请求导出为模块功能节点.js,node.js,class,request,prototype,Node.js,Class,Request,Prototype,我已尝试(成功)执行http请求。我有一些RESTAPI,比如graph.facebook.com作为目标。功能是相同的。当我用node.js作为一个简单的程序发出HTTP请求时,我可以做到。 我真的想做一个小模块,我有以下代码: // file: facebook.js var http = require('http'); var Facebook = (function() { function Facebook(access_token) { this.access_tok
// file: facebook.js
var http = require('http');
var Facebook = (function() {
function Facebook(access_token) {
this.access_token = access_token;
}
Facebook.prototype.getObject = function(id) {
var options;
this.id = id;
options = {
host: 'graph.facebook.com',
port: 80,
path: '/' + id + '?access_token=' + this.access_token
};
return http.request(options, function(response) {
response.on('data', function(d) {
return JSON.parse(d);
});
request.end();
return request.on('error', function(err) {
return {
error: 'An error ocurred.'
};
});
});
};
return Facebook;
})();
module.exports = Facebook;
之后,当我编写程序时,我可以这样做:
var facebook = require('./facebook.js');
var fb = facebook('my_Access_token')
// Here's the problem:
var response = fb.getObject('My_facebook_profile_ID')
我得到的回应是
{ domain: null,
_events:
{ response: { [Function: g] listener: [Function] },
socket: { [Function: g] listener: [Function] } },
....
当我一定要吃点什么的时候
{
"id": "MyIDNumer",
"first_name": "Orlando",
"gender": "male",
"last_name": "Sanchez",
"link": "https://www.facebook.com/MyFacebookName",
"locale": "es_LA",
"name": "Orlando S\u00e1nchez",
"username": "MyUsername"
}
我能做什么?您应该做的第一件事是重写模块,使其不使用相同的函数名两次(“Facebook”) 其次,不需要闭包,只需导出构造函数 第三,您试图从异步回调返回一个值。这个特殊的问题在来自同步世界的人中很常见 假设您想要执行GET请求,以下是修复上述问题和其他问题后重构的模块:
// file: facebook.js
var http = require('http');
function Facebook(access_token) {
if (!(this instanceof Facebook))
return new Facebook(access_token);
this.access_token = access_token;
}
Facebook.prototype.getObject = function(id, cb) {
var options;
this.id = id;
options = {
host: 'graph.facebook.com',
port: 80,
path: '/' + id + '?access_token=' + this.access_token
};
http.get(options, function(res) {
var buf = '',
hadError = false;
res.on('data', function(d) {
buf += d;
}).on('error', function(err) {
hadError = true;
cb(err);
}).on('end', function() {
if (hadError)
return;
var val;
try {
val = JSON.parse(buf);
} catch (err) {
return cb(err);
}
cb(null, val);
});
});
};
module.exports = Facebook;
然后像这样使用它:
var facebook = require('./facebook.js');
var fb = facebook('my_Access_token');
fb.getObject('My_facebook_profile_ID', function(err, response) {
if (err) {
// include better error handling here
return console.log(err);
}
// use response here
console.dir(response);
});
我是异步世界的noob,你说得对。我用CoffeScript来完成我展示的小模块。我会研究其中一些。谢谢你,我认为你的回答比我的代码更有用。两次使用同一个名字的特殊模式是常见的,一点也不危险——它们最终指的是同一件事,因此没有任何模棱两可之处。IIFE允许您在更传统的OO语言中拥有类似于
私有静态变量的东西,所以我绝对不会放弃它。它也是由CoffeeScript生成的,因此您必须绕开该语言来摆脱它。当然,但如果您不使用任何“私有”变量,它将毫无用处,并且看起来很混乱。您唯一需要关闭的其他时间是防止污染全局空间,但这仅适用于浏览器环境,而不是节点。