• 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)
    
  • 相关阅读:
    BZOJ 3110 【ZJOI2013】 K大数查询
    【mysql的编程专题⑥】视图
    【mysql的编程专题⑤】自定义函数
    MySQL错误代码大全【转载】
    【mysql的编程专题④】存储过程
    【mysql的编程专题③】内置函数
    【mysql的编程专题】触发器
    【mysql的编程专题①】流程控制与其他语法
    多线程监听串口
    IMX6输出可控PWM
  • 原文地址:https://www.cnblogs.com/jinkspeng/p/5096293.html
Copyright © 2020-2023  润新知