nodejs review-01

05 Run your first web server

  • 使用curl
//指定方法;显示header信息
curl -X GET -i localhost:3000

//扩展:显示详细的三次握手过程
curl -v localhost:3000
  • 设置内容长度
//默认会自动产生;如果手动设置比实际小,则只会传输那部分的内容;
//如果设置比实际大,浏览器会一直等待剩余部分内容而停留在加载状态;

res.writeHead(200, {
    'Content-Length': length
  });

06 Use the Node js debugger

  • 使用debug: node debug example.js
    * list(n):显示多少行代码
    * setBreakpoint: 设置断点;
    * cont: 跳到断点处;
    * repl: 打印出当前栈中的存储值;

  • 实际中常用node-inspector

13 Use arrays

  • 添加:
arr.push(val)  //return length;
arr[arr.length] = val  //return add value;
  • 删除
delete arr[n]    //just set undefined;
arr.split(n, 1);    //return deleted [val]

20 Compare synchronous and asynchronous programming

  • 读取文件
//fs.open(path, flags[, mode], callback);            
//fs.read(fd, buffer, offset, length, position, callback)

fs = require('fs');

fs.open('example.text', 'r', function (err, fd) {    //fd文件描述符
  if(err) return console.log('err');
  var buffer = new Buffer(1000000);
  fs.read(fd, buffer, 0, 1000000, null, function (err, bytes_read /*, buffer*/) {  //bytes_read读取的大小
    console.log(buffer.toString('utf8', 0, bytes_read));  //buf.toString([encoding][, start][, end])
    fs.close(fd); 
  });
});

//整个操作相当于fs.readFile;其已经包括文件打开关闭的处理;

23 Yield control and improve responsiveness

  • 单线程的阻塞
//一个查找两个数组相同值的方法
//当数据量很大的情况下,callback方法会被阻塞

setTimeout(callback, 3000);

function intersect(arr1, arr2) {
  var intersection = [];

  for(var i = 0; i < arr1.length; i++) {
    for(var j = 0; j < arr2.length; j++) {
      if(arr2[j] === arr1[i]) {
        intersection.push(arr2[j]);
        break;
      }
    }
  }
  return intersection;
}

//加入process.nextTick或setImmediate;
//差别:process.nextTick中的callback执行的优先级要高于setImmediate;
setTimeout(callback, 3000);

function intersect(arr1, arr2, cb) {
  var intersection = [], i = 0, len = arr1.length;

  function sub_compute_intersection() {
    for(var j = 0; j < arr2.length; j++) {
      if(arr2[j] === arr1[i]) {
        intersection.push(arr2[j]);
        break;
      }
    }
    i++ < len ? setImmediate(sub_compute_intersection)
      : cb(intersection);
  }
  sub_compute_intersection();
}

26 Combine loops and asynchronous programming

  • 利用回调和递归读取文件夹
var fs = require('fs');
var http = require('http');

function file_list (cb) {
  fs.readdir('./', function (err, list) {
    if(err) return cb(err);
    var dirs_only = [], len = list.length;

    (function iterator (i) {
      if(i >= len) return cb(null, dirs_only);
      fs.stat('./' + list[i], function (err, stats) {
        if(err) return cb(err);
        stats.isDirectory() && dirs_only.push(list[i]);
        iterator(++i);
      }) 
    })(0);
  })  
};


http.createServer(function (req, res) {
  file_list(function (err, list) {
    if(err) {
      res.writeHead(503, {
        'Content-Type': 'application/json'
      });
      return res.end(JSON.stringify({message: err.message}));
    } else {
      res.writeHead(200, {
        'Content-Type': 'application/json'
      });
      return res.end(JSON.stringify({data: list}));
    }
   
  });
}).listen(3000);

29 Add support for query GET parameters

  • URL解析
//设第二参数为true;
var parse_url = url.parse(req.url, true));
var pathname = parse_url.pathname;
var page = parse_url.query.page;
var size = parse_url.query.size;

//值是正数的初始化
(isNaN(page) || page <=0 ) && (page = 0)
(isNaN(size) || size <=0 ) && (size = 0)
posted @ 2016-01-03 14:03  JinksPeng  阅读(206)  评论(0)    收藏  举报