learnyounode 练习

learnyounode 是 nodeschool.io 出品的nodejs入门练习项目

通过这个练习算是对nodejs有了个入门的认识吧,边学边敲边写笔记

  • 2.输入任意数字求和.js

    // 输入任意个数字,输出这任意个数字的和
    // process.argv 变量保存了输入的参数,注意第一个永远为'node',第二个是执行路径'path/to/my/file',第三个开始才是我们真正传入的参数
    // 传入的参数当做字符串了,注意类型转换,如下面Number() 将数字字符转换为数字再进行计算
    
    var len = process.argv.length;
    // slice(2) 截取数组
    var numbers = process.argv.slice(2);
    var sum = 0;
    for (var i = numbers.length - 1; i >= 0; i--) {
          sum += Number(numbers[i]);
    };
    console.log(sum);
    
  • 3.fs.readFileSync同步方式读取文件.js

    var fs = require('fs');
    
    // 用同步方法读取README.md,以utf8编码
    var path = process.argv[2];
    var data = fs.readFileSync(path, 'utf8');
    // console.log(data);
    
    // 打印这个文件的行数
    var len = data.toString().split('\n').length;
    // 注意:长度减一才是真正的行数!
    console.log(len-1)
    
  • 4.fs.readFile异步方式读取文件.js

    var fs = require('fs');
    // 用异步方法读取README.md,以utf8编码
    var path = process.argv[2];
    fs.readFile(path, 'utf8', function (err, data) {
          if (err) {
                throw err;
          }
          // console.log(data);
          // 打印这个文件的行数,指定了上述utf8时才能省略以下的toString()方法
          var len = data.toString().split('\n').length;
          // 注意:长度减一才是真正的行数!
          console.log(len-1);
    });
    
  • 5.fs.readdir读取某目录下文件并过滤输出.js

    var fs = require('fs');
    // 用异步方法读取参数1指定的目录下的文件列表,以参数2为过滤条件
    var dir = process.argv[2];
    var filter = process.argv[3];
    fs.readdir(dir, function (err, data) {
          if (err) {
                throw err;
          }
          // 显示目录下的所有文件, 文件数为data.length
          // console.log(data);
          // 遍历,以参数2提供的后缀进行过滤
          // 构造正则,https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/RegExp
          var reg = new RegExp('\\.' + filter + '$');
          for (var i = data.length - 1; i >= 0; i--) {
          // 如果文件后缀符合参数2 则添加到新数组中
                if (reg.test(data[i])) {
                      console.log(data[i]);
                }
          }
    });
    
  • 6.module.export使用的模块 mymodule.js

    var fs = require('fs');
    function readAdir(dir, filter, callback) {
          fs.readdir(dir, function (err, data) {
                if (err) {
                      // 将错误传给回调函数处理
                      return callback(err);
                } else {
                      var reg = new RegExp('\\.' + filter + '$');
                      var newData = [];
                      for (var i = 0; i < data.length; i++) {
                            if (reg.test(data[i])) {
                                  newData.push(data[i]);
                            }
                      }
                      // 将处理后的数据传给回调函数处理
                      callback(null, newData);
                }
          });
    }
    // 导出模块
    module.exports = readAdir;
    
  • 7.http.get简单的http客户端.js

    var http = require('http');
    var url = process.argv[2];      
    http.get(url, function (res) {
          // 设置编码
          res.setEncoding('utf8');
          // 监听数据
          res.on('data', function (data) {
                console.log(data);
          });
          // 数据传输完成
          res.on('end', function (data) {
                console.log('数据接受完成!', data);
          });
    
          // 数据传输错误
          res.on('error', function (err) {
                console.log('啊哦~发生了错误。')
          });
    })
    
  • 8.http.get简单的http客户端-输出完整数据流.js

    var http = require('http');
    var url = process.argv[2];
    http.get(url, function (res) {
          // 设置编码
          res.setEncoding('utf8');
          var result = '';
          // 监听数据
          res.on('data', function (data) {
                result += data;
          });
          // 数据传输完成,将完整的数据流输出
          res.on('end', function (data) {
                console.log(result.length);
                console.log(result);
          });
          // 数据传输错误
          // res.on('error', function (err) {
                // console.log('啊哦~发生了错误。', err)
                // });
    });
    
  • 9.http.get简单的http客户端-同步get操作.js

    var http = require('http');
    var urls = process.argv.slice(2);
    var results = [];
    var count = 0;
    for (var i=0;i<urls.length;i++) {
          // 用闭包来保证顺序同步操作
          ;(function(i){
                http.get(urls[i], function (res) {
                      var result = '';
                      res.on('data', function (data) {
                            result += data;
                      });
                      res.on('end', function (data) {
                            results[i] = result;
                            count++;
                            // 计数器达到url总数,说明完成了顺序同步操作,输出结果
                            if (count === urls.length) {
                                  for (var j=0;j<count;j++) {
                                        console.log(results[j]);
                                  }
                            }
                      })
                })
          })(i);
    }
    
  • 10.net.createServer简单的TCP服务器端.js

    var net = require('net');
    var server = net.createServer(function (socket) {
          // 获取当前年、月、日、小时、分钟
          var date = new Date(),
          y = date.getFullYear(),
          m = date.getMonth() + 1,
          d = date.getDate(),
          h = date.getHours(),
          minutes = date.getMinutes();
          // 格式化
          y = y< 10 ? '0'+y: y,
          m = m< 10 ? '0'+m: m,
          d = d< 10 ? '0'+d: d,
          h = h< 10 ? '0'+h: h,
          minutes = minutes< 10 ? '0'+minutes: minutes;
          var dateString = y + '-' + m + '-' + d + ' ' + h + ':' + minutes + '\n';
          // console.log(dateString);
          // socket.write(data);
          // 输出
          socket.end(dateString);
    });
    // 监听参数指定的端口
    var port = Number(process.argv[2]);
    server.listen(port);
    
  • 11.createReadStream 输出文件内容.js

    var http = require('http');
    var fs = require('fs');
    var portNo = process.argv[2];
    var filePath = process.argv[3];
    var server = http.createServer(function (req, res) {
          // fs,createReadStream 返回 ReadStream 对象 http://nodejs.org/api/fs.html#fs_fs_createreadstream_path_options
          var readStream = fs.createReadStream(filePath);
          var body = '';
          readStream.on('data', function (chunk) {
                body += chunk;
          });
          readStream.on('end', function () {
                res.writeHead(200);
                res.end(body.toString());
          });
    });
    server.listen(portNo);
    
    // 官方答案
    // var http = require('http')
    // var fs = require('fs')
    
    // var server = http.createServer(function (req, res) {
          // fs.createReadStream(process.argv[3]).pipe(res)
    // })
    // server.listen(Number(process.argv[2]))
    
  • 12.使用through2-map将POST数据转成大写输出

    var http = require('http')
    var map = require('through2-map')
    var server = http.createServer(function (req, res) {
          // 非POST请求
          if (req.method != 'POST') {
                res.end();
          }
          req.pipe(map(toUpper)).pipe(res);
    });
    function toUpper (chunk) {
          return chunk.toString().toUpperCase();
    }
    server.listen(process.argv[2]);