• nodejs第二章节
      • 回调函数
        • Node.js 异步编程的直接体现就是回调
        • 异步编程依托于回调来实现
        • 例子1:http服务器回调
          • var http = require(“http”);//引入一个http的模块

            var server = http.createServer(function (req,res) {

            //向前台响应内容(数据)
                res.end(“大家好,我是yuk”);
            });
            //listen(端口,域名,成功的回调)
            server.listen(8080,”localhost”, function () {
                console.log(“服务器启动成功!”);
            });

        • 例子2:读取文件操作
          • var fs = require(“fs”);//文件模块

            //异步的方式->当文件读取完成后执行回调函数内容,不影响其他后续程序的执行
            /*var data = fs.readFile(“1.txt”,”utf8”, function (err,data) {

            console.log(“读取文件成功”);
                console.log(data);
            });*/
            //同步获取文件的方式->必须读取完成以后再执行之后的程序
            var data = fs.readFileSync(“1.txt”,”utf8”);
            console.log(data);
            console.log(“我是其他的代码”);

      • 常用模块讲解
        • util
          • 实现继承
            • 例子
              • var util = require(“util”);
                //实现继承
                function Parent(){
                    this.name = “老爸”;
                    this.age = 50;
                    this.sayHello = function (){

                console.log(‘hello’);
                    }
                }
                Parent.prototype.showName = function (){

                console.log(this.name);
                }
                function Child(){
                    //要继承函数内部的可以使用call或者apply
                    this.name = “儿子”;
                }
                //通过这种方式可以继承父类原型中的方法和属性
                util.inherits(Child,Parent);
                var parentObj = new Parent();
                parentObj.showName();
                var childObj = new Child();
                childObj.showName();

          • 输出对象
            • console.log(util.inspect(obj));
          • 类型验证
            • console.log(util.isArray([]));//判断是否为一个数组
              console.log(util.isRegExp(/\d/));//判断是否为一个正则表达式
        • event
          • 事件概念
            • 事件
              * 又称为发布订阅模式
              * 又称为观察者模式
              * 当主题对象发生变化时,会通知所有的观察者对象,更新自己的行动
          • 获取事件模块
            • var events = require(“events”).EventEmitter();//老的写法,跟下面的写法是等价的
              var events = require(“events”);
          • 例子:
            • var events = require(“events”);
              var util = require(“util”);

              function Girl(){
                  //创建一个女神类,它拥有一些事件
              }
              //要让女神拥有事件方法需要先继承events模块
              util.inherits(Girl,events);

              function Boy(name,response){
                  this.name = name;
                  this.response = response;
              }

              var boy1 = new Boy(“备胎1”,function (){

              console.log(“吃鸡腿”);
              });

              var boy2 = new Boy(“备胎2”, function (){

              console.log(“吃牛肉”);
              });

            • var girl = new Girl();
              girl.on(“lee”,boy1.response);
              girl.addListener(“lee”,boy2.response);
              girl.once(“die”,function (){
                  console.log(“死了”);
              });

              girl.emit(“die”);//发射事件
              girl.emit(“die”);

          • 事件
            • 注册事件
              • on
              • addListener
              • once
            • 发射事件
              • emit
            • 其他方法
              • 设置最大的监听数量
                • girl.setMaxListeners(2);
              • 移除掉单个事件
                • girl.removeListener(“ele”,boy1.response);//移除掉单个事件
            • 代码:
              • //设置最大的监听数量
                girl.setMaxListeners(2);
                //girl.on(“lee”,boy1.response);
                girl.removeListener(“lee”,boy1.response);//移除掉单个事件
                girl.removeAllListeners(“lee”);
                girl.emit(“lee”);
        • buffer
          • buffer:缓存区,暂时存放在内存里的一段数据
          • JavaScript 语言自身只有字符串数据类型,没有二进制数据类型,在处理文件流时,必须使用到二进制数据,因此在 Node.js中,定义了一个 Buffer 类,该类用来创建一个专门存放二进制数据的缓存区
          • 由一个八位字节一个字节元素组成的数组,单位用16进制表示,取值范围为0-255
          • 创建buffer对象的方法:
            • 直接创建长度为12的代码
              • var buff = new Buffer(12);//创建长度为12的数组console.log(buff);buf1.fill(255,0);//fill(填充的值,开始位置,结束位置(没有既全部))console.log(buff);
            • 通过数组
              • var buff = new Buffer([1,255,0xb3]);
                console.log(buff);
            • 通过字符串
              • var buff = new Buffer(“唐菜也”);
                console.log(buff);
            • 将buffer转成字符串通过toString
              • var buff = new Buffer([0xe5, 0x94, 0x90, 0xe8, 0x8f, 0x9c, 0xe4, 0xb9, 0x9f]);
              • console.log(buf4.toString())
            • Node中推荐使用的方式
              • var buff = new Buffer([0xe5, 0x94, 0x90, 0xe8, 0x8f, 0x9c, 0xe4, 0xb9, 0x9f]);
                var buff = new Buffer([0xe5, 0x94, 0x90, 0xe8, 0x8f]);
                var buff = new Buffer([0x9c, 0xe4, 0xb9, 0x9f]);
                console.log(buf4.toString());
                console.log(buf5.toString());

                //占用的内存高
                //console.log(Buffer.concat([buf4,buf5]).toString());

                //Node中推荐使用的方式
                var StringDecoder = require(“string_decoder”).StringDecoder;
                var decoder = new StringDecoder();
                console.log(decoder.write(buff));
                console.log(decoder.write(buff));

        • fs
          • 文件操作
            • 读取文件
              • readFile
              • readFileSync
            • 写入文件
              • writeFile
                • 第一个参数为写入的文件名
                • 第二个为写入写入的文件内容
                • 第三个为配置参数
                  • {    flag:”a”}
                    • a:追加
                    • w:写入
                    • r:读取
                • 第四个为回调
                • 代码:
                  • var fs = require(“fs”);fs.writeFile(“file.txt”,”我是通过写入的文件内容”,{    flag:”a”},function (err){    if (err){        return console.error(err);    }    console.log(“文件写入成功”);    fs.readFile(“file.txt”,”utf8”,function (err,data){        console.log(data);    })});
              • appendFile
                • fs.appendFile(“file.txt”,”\n最佳”,function (err){    if (err){        return console.error(err);    }    console.log(“追加成功”);});
            • 复制文件
              • fs.readFile(“file.txt”,”utf8”,function(err,data){    //console.log(data);    fs.writeFile(“file2.txt”,data,{        encoding:”utf8”    },function (err){        if (err){            return console.error(err);        }        console.log(“复制成功”);    })});
          • 目录操作
            • 创建目录
              • fs.mkdir(“test”,0777, function (err) {
                    if(err){
                        console.error(err);
                    }
                });
              • mode 的三个数字,分别表示owner(所有者),group(组用户),others(其他用户)所具有的权限。
                 1 = x 执行 2 = w 写 4 = r 读,比如owner具有所有权限,1+2+4=7,
                 又比如group 具有读 和执行权限 1+4 = 5
            • 读取目录
              • fs.readdir(“test”, function (err,files) {
                    if (err){
                        console.error(err);
                    }else{
                        console.log(files);
                    }
                });
            • 查看文件或者目录详情
              • fs.stat(‘test’, function (err,stat) {

                if (err){
                        console.error(err);
                    }else{
                        console.log(stat);
                    }
                });

            • 判断文件是否存在
              • fs.exists(“test/1.jpg”, function (exists) {

                console.log(exists);
                })

            • 相对路径获取绝对路径
              • fs.realpath(“test”, function (err,path) {

                console.log(path);
                });

            • 修改文件名
              • fs.rename(“test2”,”test”, function (err) {
                    if (err){
                        console.error(err);
                    }
                });
        • stream
          • Stream可以算是node里的一出重头戏,与大数据处理方面有密切不可分的关系
            • var fs = require(‘fs’);
              function copy( src, dest ){
                  fs.writeFileSync( dest, fs.readFileSync(src) );
              }
              copy(‘data.son’, ‘dataStream.json’);
            • 上面是一个对文件拷贝的代码,看似没什么问题,也的确在处理小文件的时候没什么大问题,但是一旦处理数量级很大的文件的时候可以看出,先将数据读取出来,在写入,内存作为中转,如果文件太大就会产生问题。
          • 如果是大文件就得使用file system的另外几个API,createReadStream和fs.createWriteStream,将文件作为一块一块小的数据流进行处理,而不是一整块大型数据
            • // 也可能出现内存爆仓 写入数据跟不上读取速度 一直读取的文件不断放入内存中
              // 但是两个操作速度绝对是不一样的,于是未被写入的数据在内存中不断变大,就可能会导致内存的爆仓。
              var fs = require(‘fs’);
              var rs = fs.createReadStream(‘data.son’);
              var ws = fs.createWriteStream(‘dataStream.json’)
              rs.on(‘data’,function(chunk){
                  console.log(‘data chunk read ok’);
                  times++;
                  ws.write(chunk,function(){
                      console.log(‘data chunk write ok’);
                  });
              });
              rs.on(‘end’,function(){
                  console.log(times);
              });
            • 可以先写一个129k的文件
              • var fs = require(“fs”);
                fs.writeFile(“128k.txt”,new Buffer(129 * 1024));
          • 对于这种情况 node里面有一个pipe的方法 连接两个数据流,犹如导管一样将数据读入写入
            • function copy( src, dest ){
                  fs.createReadStream( src ).pipe( fs.createWriteStream( dest ) );
              }
              copy(‘data.son’, ‘dataStream.json’);
        • path
          • normalize:规范化字符串路径
            • console.log(path.normalize(“./../a///b/c/.././d//“));
          • __dirname
          • join 将多个参数值字符串结合成一个路径字符串
            • console.log(path.join(__dirname,”a”,”b”,”..”,”c”));
          • resolve:把参数解析为一个绝对路径
            * 1.以应用程序的根目录为起点,根据参数的值解析出一个绝对路径
            * 2. .当前目录 ..上级目录
            * 3. 普通字符串代表下一级目录
            * 4. 如果没有下一个参数,返回当前路径
            * 5. /代表盘符的根目录
            • console.log(path.resolve(“/test/index.html”));
              console.log(path.resolve(‘wwwroot’, ‘static_files/png/‘, ‘../gif/image.gif’));
              console.log(path.resolve(“../7.fs/img.js”));
      • http模块深入讲解
        • http协议讲解
          • http:超文本传输协议,是互联网使用最广的一个协议
          • http 模块主要用于搭建 HTTP 服务端和客户端,使用 HTTP 服务器或客户端功能必须调用 http 模块
        • http——api讲解
          • 创建服务器
            • var http = require(“http”);
              var url = require(“url”);
              //创建服务器
              //http继承自tcp
              var server = http.createServer(function (req,res) {

              var urlstr = req.url;//获取请求的路径
                  var urlMethod = req.method;//获取请求的方法
                  /*var urlObj = url.parse(urlstr,true);
                  console.log(urlObj);*/
                  //console.log(urlMethod);
                  res.end(“hello”);
              });
              server.listen(8080);

          • 对请求进行处理
            • var server = http.createServer(function (req,res) {

              var urlstr = req.url;//获取请求的路径
                  var urlMethod = req.method;//获取请求的方法
                  var urlObj = url.parse(urlstr,true);
                  console.log(urlObj);
                  console.log(urlMethod);
                  console.log(req.headers);//获取请求头
                  console.log(req.httpVersion);//获取http的版本
                  req.on(“data”, function (chunk) {//获取POST方式发送过来的数据
                      console.log(chunk.toString());//chunk:数据块
                  });

              /*res.statusCode = 404;//设置返回的状态码
                  res.setHeader(“name”,”tangcaiey”);//设置返回的头*/
                  //res.setHeader(,);
                  res.writeHead(200,{name:”tangcaiye”,pass:”1234”,”Content-Type”:”text/html;charset=utf-8”});
                  res.write(“hello”);
                  res.write(“yuk”);
                  res.end();
              });
              server.listen(8080);

          • 前端发送post请求
            • <!DOCTYPE html>
              <html lang=“en”>
              <head>
                  <meta charset=“UTF-8”>
                  <title>这是表单页的标题</title>
              </head>
              <body>
              <!—
                  如果没有文件的话可以使用application/x-www-form-urlencoded
                  但是如果有文件的话一定更要用multipart/form-data
              —>
              <form action=“/upimg” method=“post” enctype=“multipart/form-data”>
                  用户名: <input type=“text” name=“user”><br>
                  密码: <input type=“password” name=“pass”><br>
                  上传图片: <input type=“file” name=“file1”><br>
                  <input type=“submit” value=提交>
              </form>
              </body>
              </html>
          • 上传文件的处理
            • var http = require(“http”);
              var url = require(“url”);
              var fs = require(“fs”);
              var query string = require(“query string”);
              var formidable = require(“formidable”);
              //创建服务器
              //http继承自tcp
              var server = http.createServer(function (req,res) {

              //获取请求的路径
                  var urlObj = url.parse(req.url,true);
                  var pathname = urlObj.pathname;

              if(pathname == “/upimg.html”){
                      var rs = fs.createReadStream(“./upimg.html”);
                      rs.pipe(res);
                  }else if(pathname == “/upimg”){

              var form = new formidable.IncomingForm();
                      form.parse(req, function (err,fields,files) {
                          //fields->以对象格式返回字段
                          /*console.log(fields);
                          console.log(files);*/
                          //将暂存文件写入到upload文件目录中
                          fs.createReadStream(files.file1.path).pipe(fs.createWriteStream(“./upload/“+files.file1.name));
                          res.setHeader(“Content-Type”,”text/html;charset=utf8”);
                          res.write(JSON.stringify(fields));
                          res.end(‘<img src=“/upload/‘+files.file1.name+’”>’);
                      });
                  }else if(pathname != “/favicon.ico”){

              fs.createReadStream(“.”+pathname).pipe(res);
                  }
              });
              server.listen(8080);

          • http模拟客户端
            • var http = require(“http”);
              //request函数允许后台发布请求,第一个参数是一个对象或者字符串
              var options = {
                      host: ‘localhost’,
                      port: ‘8080’,
                      path: ‘/reg’,
                      method:”POST”,
                      headers:{
                          “Content-Type”:”application/json”
                      }
              };
              /*
              * request :发请求
              * http.request() 返回一个 http.ClientRequest类的实例。ClientRequest实例是一个可写流对象。
              * 如果需要用POST请求上传一个文件的话,就将其写入到ClientRequest对象
              * */
              var request = http.request(options, function (res) {
                  console.log(res.statusCode);
                  //获取响应回来的内容
                  res.setEncoding(“utf8”);
                  res.on(“data”, function (chunk) {

              console.log(chunk);
                  });
              });
              request.write(‘{“user”:”tangcaiye”,”pass”:”12345”}’);
              request.end();//结束写请求体,真正向服务器发起请求

nodejs(二)的更多相关文章

  1. nodejs(二) --- 重要知识点回顾

    1. 运行一个nodejs文件, 如一个js文件中只含有console.log("hello world");的文件,我们再git里运行node,即 node hello.js 即 ...

  2. typescript与nodejs(二)基于装饰器实现路由表

    之前实现了一个简单的WebServer 但是这离实际使用还有一点距离 webserver 首先面对第一个问题是路由表 啥是路由表 路由表别看听起来神秘,但是其实就是 if else onhttp- { ...

  3. nodejs(二)child_process模块

    1.child_process是Node.js的一个十分重要的模块,通过它可以实现创建多进程,以利用多核计算资源. child_process模块提供了四个创建子进程的函数,分别是spawn,exec ...

  4. nodejs入门最简单例子

    一.mac话,先安装nodejs环境: brew install nodejs 二.先写一个main.js var http = require("http"); http.cre ...

  5. Linux 安装 Nodejs 的两种方式

    Linux 安装 Nodejs 的两种方式 目录 Linux 安装 Nodejs 的两种方式 一.压缩包安装 Nodejs 二.源码编译安装 Nodejs 一.压缩包安装 Nodejs 下载 Node ...

  6. IDE-Sublime【3】-配置Node.js开发环境

    一.下载Nodejs插件,下载地址为https://github.com/tanepiper/SublimeText-Nodejs,解压到当前文件夹,改名为Nodejs 二.打开Sublime Tex ...

  7. PHP全栈工程师学习大纲

    一.高性能网站开发功力提升 时间 标题 内容概要 2015-12-28 开学典礼以及工程师成长路线图 工程师成长的发展路径图.三个阶段,在各个阶段需要提升自己的地方,从技术上也讲了一些提高分析代码的工 ...

  8. elasticsearch5安装

    环境: centos7 es 5.4.3 es安装 一.下载 wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsear ...

  9. 在centos7 上部署 vuepress

    vuepress是一款十分优秀简洁的文档生成器,可以根据目录下的md文档自动生成对应的html文件,界面简洁大方.每一个由 VuePress 生成的页面都带有预渲染好的 HTML,也因此具有非常好的加 ...

随机推荐

  1. 366. Fibonacci【Naive】

    Find the Nth number in Fibonacci sequence. A Fibonacci sequence is defined as follow: The first two ...

  2. Scanner.findInLine()与while的使用莫名其妙的导致NoSuchElementException: No line found

    public static boolean parseHTML(Scanner sc, List<String> errorInfo) { String[] tags = new Stri ...

  3. mysql索引学习

    索引用于快速找出在某列中有一特定值的行. 如果不使用索引,MySQL必须从第一条记录开始读完整个表,直到找出相关的行. 表越大,查询数据所花费的时间越多. 如果表中查询的列有一个索引,MySQL能快速 ...

  4. 抹掉Scala的糖衣(14) -- Update Method

    欢迎关注我的新博客地址:http://cuipengfei.me/ 在Scala中,名字叫做update的方法是有特殊作用的. 比如: 1 2 3 val scores = new scala.col ...

  5. Reveal Jquery 模式对话框插件

    /* * jQuery Reveal Plugin 1.0 * www.ZURB.com * Copyright 2010, ZURB * Free to use under the MIT lice ...

  6. 关于Cocos2d-x中两个场景之间参数的传递

    两个场景之间,有的时候要进行参数传递,如果想通过实例化出一个场景,从而得到属性和方法是不对的想法 你有两个场景,第一场景是用户登录界面,第二场景则是你登录后的界面,你如何将用户登录的值传到第二个场景呢 ...

  7. Virtual Box下安装Oracle Linux 6.3

    Oracle Linux 6.3已经公布快2年了,其功能有非常大的提升,增强了KVM,文件卷的在线resizing,LVM支持 raid4, 5, 6.支持很多其它的虚拟CPU数以及更大内存,详细能够 ...

  8. 模拟form表单请求上传文件

    发请求 public string CameraFileUpload(string url,string path,string serverPath,string uploadfileName) { ...

  9. 将execel表格的数据导入到mysql数据库

    在开发中经常会将现成的execel表格导入到数据库里,否则一个个字段插入填写,太浪费时间,效率很低.本文主要是讲如果将execel表格导入到mysql数据库,希望对各位有所帮助.使用软件:sql工具: ...

  10. 审批流_state_selection 相关用法

    审批流 _state_selection 前部分参数代表:新加的状态 后部分参数代表:原有系统的状态