Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/39.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js 将HTTP请求导出为模块功能节点.js_Node.js_Class_Request_Prototype - Fatal编程技术网

Node.js 将HTTP请求导出为模块功能节点.js

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

我已尝试(成功)执行http请求。我有一些RESTAPI,比如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);
});

我是异步世界的noob,你说得对。我用CoffeScript来完成我展示的小模块。我会研究其中一些。谢谢你,我认为你的回答比我的代码更有用。两次使用同一个名字的特殊模式是常见的,一点也不危险——它们最终指的是同一件事,因此没有任何模棱两可之处。IIFE允许您在更传统的OO语言中拥有类似于
私有静态变量的东西,所以我绝对不会放弃它。它也是由CoffeeScript生成的,因此您必须绕开该语言来摆脱它。当然,但如果您不使用任何“私有”变量,它将毫无用处,并且看起来很混乱。您唯一需要关闭的其他时间是防止污染全局空间,但这仅适用于浏览器环境,而不是节点。