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

标签 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"
}

我能做什么?

最佳答案

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

关于node.js - 将 HTTP 请求导出为模块函数 Node.js,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23233221/

相关文章:

android - 使用 Node.JS 向 Firebase 发出 HTTPS 请求

node.js - webpack +express.js 不加载bundle.js

Python - 一个对象可以是它自己的类型吗?

java - Camel InOut 登录和退出

c# - 使用 C# 的 SOAP 客户端

javascript - Socket.io动态 "on"绑定(bind)

node.js - mongo 可以 upsert 数组数据吗?

java - 有没有办法缩短这段重复的代码? (添加 JPanel 组件)

c - 为什么在c中将指针转换为双指针?

vb.net - 如何获取 URL 和查询字符串?网络