Node.js v0.6.19 http.get 版本差异

每次遇到node版本差异导致的问题时,我都会感到蛋蛋在隐隐作痛.

v0.6.19中的http.get第一个参数options是不能直接传入字符串的.

这意味着当我使用http.get时,必须将url拆分成JSON对象.

一个简单的url比如http://www.blackglory.me/node-js-v0-6-19-http-get-version-differences/

拆分url后的JSON对象可能类似这样:

{
  protocol:'http',
  host:'www.blackglory.co.cc',
  path:'/node-js-v0-6-19-http-get-version-differences/',
  href:'http://www.blackglory.me/node-js-v0-6-19-http-get-version-differences/',
  pathname:'/node-js-v0-6-19-http-get-version-differences/'
}

这很麻烦,为此我们还必须去编写一个function来拆分字符串.

为了搞清楚高版本是如何拆分字符串的,保证兼容性,我去看了Node的源码:https://github.com/joyent/node/blob/master/lib/http.js

get方法:

exports.get = function(options, cb) {  
  var req = exports.request(options, cb);
  req.end();
  return req;
};

这里通过request方法对options进行了预处理.

再来看看request方法:

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);
};

问题已经解决了,从这段源码可以知道,request判断options的类型为string时,会调用url.parse将其转换为JSON对象.

接下来在使用时只需要引入url模块,在传参前对url进行转换即可.

var http = require('http'),  
    url = require('url');
http.get(url.parse('http://www.blackglory.me/node-js-v0-6-19-http-get-version-differences/'),callback);