IT兄弟会全栈工程师精英班第四天(学习笔记)

搭建静态资源服务器之node HTTP模块

  • 1. 代码如下:
    const http  = require('http');
    const ip    = '192.168.1.108';
    const port  = 3608;
    
    http.createServer((req,res)=>{
        res.writeHead(200,{'Content-Type':'text/html'});
        res.write("<html>");
        res.write("<head>");
        res.write("</head>");
        res.write("<body>");
        res.write("<h1>hello nodejs world!</h1>");
        res.write("</body>");
        res.write("</html>");
        res.end();
    }).listen(port,ip,()=>{
        console.log('server start');
    });
    
    • 先在linux输入命令
      root@tecmint:~# node app.js
      
      显示
      server start //表示已经启动服务
      
    • 在浏览器中输入ip地址
      192.168.1.108:3608 //显示相对应的信息
      
  • 封装成函数
    • 代码如下:
    const http  = require('http');
    const ip    = '192.168.2.108';
    const port  = 3608;
    var fn = function(req,res){
        res.writeHead(200,{'Content-Type': 'text/html'});
        res.write("<html>");
        res.write("<head>");
        res.write("</head>");
        res.write("<body>");
        res.write("<h1>hello nodejs world!</h1>");
        res.write("</body>");
        res.write("</html>");
        res.end();
    }
    
    var fs = function(){
        console.log('server start');
    }
    
    http.createServer(fn).listen(port,ip,fs);
    

搭建静态资源服务器之node URL模块

  • url.parse(urlStr[, parseQueryString][, slashesDenoteHost]);
    • 说明: 将一个URL字符串转换成对象并返回
    • 参数:
      • urlStr 表示url字符串
      • parseQueryString 为true时将使用查询模块分析查询字符串,默认为false
      • slashesDenoteHost
        默认为false,//foo/bar 形式的字符串将被解释成 { pathname: ‘//foo/bar' }
        如果设置成true,//foo/bar 形式的字符串将被解释成 { host: ‘foo', pathname: ‘/bar' }
    • 代码如下:
    const http  = require('http');
    const url   = require('url');
    const ip    = '192.168.2.108';
    const port  = 3608;
    var fn = function(req,res){
        var pathname = url.parse(req.url).pathname;
        res.write(pathname);
        res.end();
    }
    
    var fs = function(){
        console.log('server start');
    }
    
    http.createServer(fn).listen(port,ip,fs);
    

搭建静态资源服务器之node fs模块

  • Node.js 文件系统(fs 模块)模块中的方法均有异步和同步版本,例如读取文件内容的函数有异步的 fs.readFile() 和同步的 fs.readFileSync()。

    异步的方法函数最后一个参数为回调函数,回调函数的第一个参数包含了错误信息(error)。

    建议大家是用异步方法,比起同步,异步方法性能更高,速度更快,而且没有阻塞。

  • fs.readFile(file[, options], callback);

    • 说明:
      • 异步读取文件。其中file可以为文件名或文件路径,options可以为对象或字符串。包括读取文件时的编码、文件的读取方式(默认为‘r’);
      • fs.readFile(文件名,编码,回调函数(err,data));
    • 代码如下:
    var fs = require("fs");
    
    // 异步读取
    fs.readFile('input.txt', function (err, data) {
       if (err) {
           return console.error(err);
       }
       console.log("异步读取: " + data.toString());
    });
    
    // 同步读取
    var data = fs.readFileSync('input.txt');
    console.log("同步读取: " + data.toString());
    
    console.log("程序执行完毕。");
    

nodejs文件操作模块FS(File System)常用函数简明总结

  • 件系统操作相关的函数挺多的。首先可以分为两大类。

  • 一类是异步+回调的。 一类是同步的。

  • 在这里只对异步的进行整理,同步的只需要在函数名称后面加上Sync即可

  • 1.1 首先是一类最常规的读写函数,函数名称和形式,应该是起源于C语言的。

    • fs.open(path, flags[, mode], callback);

      • 说明:异步模式下打开文件
      • fs.open(文件路径,读写标识,[文件mode值,666],回调函数(err,文件句柄fd));
      • 参数:
        • path - 文件的路径。
        • flags - 文件打开的行为。具体值详见下文。
        • mode - 设置文件模式(权限),文件创建默认权限为 0666(可读,可写)。
        • callback - 回调函数,带有两个参数如:callback(err, fd)。
      • 实例:
        var fs = require("fs");
        // 异步打开文件
        console.log("准备打开文件!");
        fs.open('input.txt', 'r+', function(err, fd) {
           if (err) {
               return console.error(err);
           }
          console.log("文件打开成功!");
        });
        
        以上代码执行结果如下:
        $ node file.js
        准备打开文件!
        文件打开成功!
        
    • fs.read(fd, buffer, offset, length, position, callback);

      • 说明:异步模式下读取文件

      • fs.read(文件句柄fd,被写入的buffer,offset,length,position,回调函数(err, bytesRead, buffer));

      • 参数 :

        • fd - 通过 fs.open() 方法返回的文件描述符。
        • buffer - 数据写入的缓冲区。
        • offset - 缓冲区写入的写入偏移量。
        • length - 要从文件中读取的字节数。
        • position - 文件读取的起始位置,如果 position 的值为 null,则会从当前文件指针的位置读取。
        • callback - 回调函数,有三个参数err, bytesRead, buffer,err 为错误信息, bytesRead 表示读取的字节数,buffer 为缓冲区对象。

        其功能为从指定的文件描述符 fd 中读取数据并写入 buffer 指向的缓冲区对象。offset 是buffer 的写入偏移量。length 是要从文件中读取的字节数。position 是文件读取的起始位置,如果 position 的值为 null,则会从当前文件指针的位置读取。回调函数传递bytesRead 和 buffer,分别表示读取的字节数和缓冲区对象。
        - 实例:
        ```
        var fs = require("fs");
        var buf = new Buffer(1024);

        console.log("准备打开已存在的文件!");
        fs.open('input.txt', 'r+', function(err, fd) {
        if (err) {
        return console.error(err);
        }
        console.log("文件打开成功!");
        console.log("准备读取文件:");
        fs.read(fd, buf, 0, buf.length, 0, function(err, bytes){
        if (err){
        console.log(err);
        }
        console.log(bytes + " 字节被读取");

            // 仅输出读取的字节
            if(bytes > 0){
               console.log(buf.slice(0, bytes).toString());
            }
         });
        

        });

        以上代码执行结果如下:
        

        $ node file.js
        准备打开已存在的文件!
        文件打开成功!
        准备读取文件:
        42 字节被读取
        百度:www.baidu.com

    • fs.write(文件句柄fd,被读取的buffer,offset,length,position,回调函数(err,bytesWritten,buffer));

      功能为将buffer内容写入fd中。
      + fs.close(文件句柄,回调函数);
      + fs.truncate(文件句柄,截断长度,回调函数);
      + fs.fsync(文件句柄,回调函数);

    • 未完待续;

构建一个静态资源的服务器,根据不同的url地址请求不同的文件(模板)

  • 实例:
    //加载http服务api模块
    var http = require('http');
    var ip   = '192.168.1.108';
    //加载fs文件服务api模块
    var fs   = require('fs');
    //创建新的HTTP服务器
    var server = new http.Server();
    //创建url路由api模块
    var urlpai = require('url');
    //监听端口
    server.listen(3068,ip);
    
    //使用on方法注册事件处理,该事件一直被监听。任何的请求都会进入回调函数,执行相应的操作
    server.on("request",function(request,response){//当有request请求的时候触发处理函数
        //解析请求url
        var url = urlpai.parse(request.url);
    
        //监听请求的网站,以当前脚本目录为根目录的url地址
        //console.log(url.pathname);
    
        //特殊url会让服务器在发送响应前先等待
        switch(url.pathname){
            case '' || '/'://处理请求的网站根目录,指定加载对应的文件夹,一般以根目录的index.html为默认,node.js是高效流处理的方案,也可以通过配置文件来配置
                fs.readFile("./index.html",function(err,data){//打开请求文件
                    if(err){    //输入错误信息,也可以自定义错误信息
                        response.writeHead(404,{'Content-Type':'text/plain;charset="UTF-8"'});
                        response.write(err.message);
                        response.end();
                    }else{  //请求成功返回数据
                        response.writeHead(200,{'Content-Type':'text/html;charset="UTF-8"'});  //告诉响应头文件,返回数据的类型
                        response.write(data);//返回的内容,有时候还会加上buter数据类型
                        response.end();//结束相应,不写的话。会一直处于相应状态,页面不会显示内容
                    }
                });
                break;
            case '/list':   //显示商品列表页
                fs.readFile("./list.html",function(err,data){
                    if(err){
                        response.writeHead(400.{'Content-Type':'text/plain;charset="UTF-8"'});
                        response.write(err.message);
                        response.end();
                    }else{
                        response.writeHead(200,'Content-Type':'text/html;charset="UTF-8"');
                        response.write(data);
                        response.end();
                    }
                });
                break;
            case '/detail': //商品详情页
                fs.readFile("./detail.html",function(err,data){
                    if(err){
                        response.writeHead(400,{'Content-Type':'text/plain;charset="UTF-8"'});
                        response.write(err.message);
                        response.end();
                    }else{
                        response.writeHead(200.{'Content-Type':'text/html;charset="UTF-8"'});
                        response.write(data);
                        response.end();
                    }
                });
                break;
            default:    //处理来自本地目录的文件,主要是一些静态资源文件,搭建静态服务器还有其他方法
                var fileName = url.pathname.substring(1);   //去掉前导'/'
                var types    = getType(fileName.substring(fileName.lastIndexOf('.')+1));
                console.log(fileName);  //取得文件类型 css  js  ....
                //异步读取文件,并将内容作为单独的数据模块传给回调函数
                //对于确实很大的文件,使用流API fs.createReadStream()更好
                fs.readFile(fileName,function(err,data) {
                    if(err){
                        response.writeHead(400,{'Content-Type':'text/plain;charset="UTF-8"'});
                        response.write(err.message);
                        response.end();
                    }else{
                        response.writeHead(200,{'Content-Type':types});
                        response.write(data);
                        response.end();
                    }
                });
                break;
        }
    });
    
    //判断文件类型的函数
    function getType(endTag){
        var type = null;
        switch (endTag) {
            case 'html':
                type = 'text/html;charset=UTF-8';
                break;
            case 'htm':
                type = 'text/html;charset=UTF-8';
                break;
            case 'txt':
                type = 'text/plain;charset=UTF-8';
                break;
            case 'css':
                type = 'text/css;charset=UTF-8';
                break;
            case 'js':
                type = 'application/javascript;charset=UTF-8';
                break;
            case 'manifest':
                type = 'text/cache-manifest;charset=UTF-8';
                break;
            default:
                type = 'application/octet-stream';
        }
        return type;
    }
    
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 193,812评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,626评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,144评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,052评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 60,925评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,035评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,461评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,150评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,413评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,501评论 2 307
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,277评论 1 325
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,159评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,528评论 3 298
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,868评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,143评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,407评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,615评论 2 335

推荐阅读更多精彩内容