zoukankan      html  css  js  c++  java
  • require("http").request(options, cb)的一些研究

    由于决定用couthDB做我的默认数据库,于是用到http.request,但请求死活发不出去

    定位到1144行

    // require("http").request(options, cb)
     function ClientRequest(options, cb) {
      var self = this;
      OutgoingMessage.call(self);
    
      self.agent = options.agent === undefined ? globalAgent : options.agent;//是否使用代理
    
      var defaultPort = options.defaultPort || 80;
    
      var port = options.port || defaultPort;
      var host = options.hostname || options.host || 'localhost';
    
      if (options.setHost === undefined) {
        var setHost = true;
      }
    
      self.socketPath = options.socketPath;
    
      var method = self.method = (options.method || 'GET').toUpperCase();
      self.path = options.path || '/';
      if (cb) {
        self.once('response', cb);
      }
    
      if (!Array.isArray(options.headers)) {
        if (options.headers) {
          var keys = Object.keys(options.headers);
          for (var i = 0, l = keys.length; i < l; i++) {
            var key = keys[i];
            self.setHeader(key, options.headers[key]);
          }
        }
        if (host && !this.getHeader('host') && setHost) {
          var hostHeader = host;
          if (port && +port !== defaultPort) {
            hostHeader += ':' + port;
          }
          this.setHeader('Host', hostHeader);
        }
      }
    
      if (options.auth && !this.getHeader('Authorization')) {
        //basic auth
        this.setHeader('Authorization', 'Basic ' +
                       new Buffer(options.auth).toString('base64'));
      }
    
      if (method === 'GET' || method === 'HEAD' || method === 'CONNECT') {
        self.useChunkedEncodingByDefault = false;
      } else {
        self.useChunkedEncodingByDefault = true;
      }
    
      if (Array.isArray(options.headers)) {
        self._storeHeader(self.method + ' ' + self.path + ' HTTP/1.1\r\n',
                          options.headers);
      } else if (self.getHeader('expect')) {
        self._storeHeader(self.method + ' ' + self.path + ' HTTP/1.1\r\n',
                          self._renderHeaders());
      }
      if (self.socketPath) {
        self._last = true;
        self.shouldKeepAlive = false;
        if (options.createConnection) {
          self.onSocket(options.createConnection(self.socketPath));
        } else {
          self.onSocket(net.createConnection(self.socketPath));
        }
      } else if (self.agent) {
        // If there is an agent we should default to Connection:keep-alive.
        self._last = false;
        self.shouldKeepAlive = true;
        self.agent.addRequest(self, host, port, options.localAddress);
      } else {
        // No agent, default to Connection:close.
        self._last = true;
        self.shouldKeepAlive = false;
        if (options.createConnection) {
          options.port = port;
          options.host = host;
          var conn = options.createConnection(options);
        } else {
          var conn = net.createConnection({
            port: port,
            host: host,
            localAddress: options.localAddress
          });
        }
        self.onSocket(conn);
      }
    
      self._deferToConnect(null, null, function() {
        self._flush();
        self = null;
      });
    
    }
    util.inherits(ClientRequest, OutgoingMessage);
    
    exports.ClientRequest = ClientRequest;
    

    没有结果,这只是一个类,继续

    
    exports.request = function(options, cb) {
      if (typeof options === 'string') {
        options = url.parse(options);
      }
    
      if (options.protocol && options.protocol !== 'http:') {
        throw new Error('Protocol:' + options.protocol + ' not supported.');
      }
    
      return new ClientRequest(options, cb);
    };
    
    exports.get = function(options, cb) {
      var req = exports.request(options, cb);
      req.end();
      return req;
    };
    

    发现http.get比http.request唯一要多做的是加了个req.end(),崩溃!

    另,此回调果真只有一个参数,即http.createServer(function(req, res) {})的第二个参数一样!

    我们只要加个end就可以让程序运行了!(要先安装与启到couthDB)

    var http = require('http');
    
    var options = {
        port: 5984,
        method: 'GET'
    };
    //这个回调果真只有一个参数,即http.createServer(function(req, res) {})
    var req = http.request(options, function(res) {
        console.log('STATUS: ' + res.statusCode);
        console.log('HEADERS: ' + JSON.stringify(res.headers));
        res.setEncoding('utf8');
        var body = ""
        res.on('data', function (chunk) {
            body += chunk
        });
        res.once("end", function(){
            var json = JSON.parse(body);
            console.log(json)
        })
    });
    req.end()
    req.on('error', function(e) {
      console.log('problem with request: ' + e.message);
    });
    
    
  • 相关阅读:
    Java 中队列的使用
    数据挖掘十大经典算法
    数据结构之图(术语、存储结构、遍历)
    openldap---ldapsearch使用
    RDBMS 数据库补丁集补丁号码高速參考-文档 ID 1577380.1
    关于 ioctl 的 FIONREAD 參数
    Oracle 事务的開始与结束
    泛泰A880S升级官方4.4.2 binx教程
    设计模式18---设计模式之策略模式(Strategy)(行为型)
    java实现矩形区域的交和并
  • 原文地址:https://www.cnblogs.com/rubylouvre/p/2653542.html
Copyright © 2011-2022 走看看