看到一個很讚的演示,搬運一下地址。
涉及到http超時處理,stream讀寫大文件,串並行的異步調用等,對node初學者是很好的啓發。
如下是搬運了演示裏的一些代碼:node
var http = require('http'); var parse = require('url').parse; function urlget(url, callback) { var info = parse(url); var options = {host: info.hostname, port: info.port || 80, path: info.path, method: 'GET'}; var req = null, request_timeout = null; request_timeout = setTimeout(function() { request_timeout = null; req.abort(); callback(new Error('Request timeout!!')); }, 2000); var req = http.request(options, function(res) { clearTimeout(request_timeout); var chunks = [], length = 0, response_timeout = null; response_timeout = setTimeout(function() { response_timeout = null; req.abort(); callback(new Error('Response timeout!!')); }, 2000); res.on('data', function(chunk) { length += chunk.length; chunks.push(chunk); }).on('end', function() { if(response_timeout) { clearTimeout(response_timeout); var data = Buffer.concat(chunks,length); res.body = data; callback(null, res); } }).on('error', function(err) { callback(err, res); }).on('aborted', function() { if(response_timeout) { callback(new Error('Response aborted!!'), res); } }); }).on('error', function(err) { if(request_timeout) { clearTimeout(request_timeout); callback(err); } }); req.end(); }; //驗證請求超時 var timeout_url = 'http://t.co/'; urlget(timeout_url, function(err, res) { console.log('getting: ', timeout_url); if(err) { console.log('error:\n', err, '\nresponse:\n', res ? res.headers : null); } else { console.log('headers:\n', res.headers, '\nbody:\n', res.body.toString()); } }); //正常狀況訪問 var good_url = 'http://www.baidu.com'; urlget(good_url, function(err, res) { console.log('getting: ', good_url); if(err) { console.log('error:\n', err, '\nresponse:\n', res ? res.headers : null); } else { console.log('headers:\n', res.headers, '\nbody:\n', res.body.toString()); } }); //驗證響應超時 本身搭一個服務器 var res_url = 'http://localhost:1984/foo?s=10'; urlget(res_url, function(err, res) { console.log('getting: ', good_url); if(err) { console.log('error:\n', err, '\nresponse:\n', res ? res.headers : null); } else { console.log('headers:\n', res.headers, '\nbody:\n', res.body.toString()); } }); //搭建超時服務器 var http = require('http'), parse = require('url').parse; http.createServer(function(req, res) { var info = parse(req.url, true); var s = +info.query.s; res.write('Please waitting for ' + s + ' seconds...'); setTimeout(function() { res.end(s + ' seconds, url: ' + req.url); }, s * 1000); }).listen(1984); console.log('Server http://localhost:1984/');