将HTTP请求导出为模块函数Node.js

时间:2014-04-23 01:27:06

标签: node.js class request prototype

我已尝试(成功)执行http请求。我有一些REST Api,比如graph.facebook.com作为目标。功能是一样的。当我使用node.js作为简单程序发出HTTP请求时,我可以做到。 真的我想制作一个小模块,我有这个代码:

// 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"
}

我该怎么办?

1 个答案:

答案 0 :(得分:1)

你应该做的第一件事是重写模块,不要两次使用相同的功能名称(' 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);
});