静态资源服务器功能

Posted 浮华夕颜

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了静态资源服务器功能相关的知识,希望对你有一定的参考价值。

/**
 * 静态服务器功能:核心模块HTTP
 * 初步实现服务器功能
 */
const http = require(\'http\');
//创建服务器实例对象
let server = http.createServer();
//绑定请求事件
server.on(\'request\',(req,res) => {
    res.end(\'hello\');
});
//监听端口  访问地址:localhost:3000
server.listen(3000);
//=========================================
http.createServer((req,res) => {
    res.end(\'ok\');
}).listen(3000,\'196.167.0.8\',() => {
    //此时不能再用localhost访问了,只能用IP地址:3000
    console.log(\'running...\');
});
/**
 * 处理请求路径的分发
 * 因为访问localhost:3000、localhost:3000/index.html、localhost:3000/about.html等页面时,显示内容都一样
 * 1.req对象是Class:http.IncomingMessage的实例对象
 * 2.res对象是Class:http.ServerResponse的实例对象
 */
const http = require(\'http\');
http.createServer((req,res) => {
    //req.url可以获取URL中的路径(端口之后的路径)
    //res.end(req.url);
    if(req.url.startsWith(\'/index\')){
        //write向客户端相应内容,可多次写回,拼写到一起
        res.write(\'hello\');
        res.write(\'welcome\');
        //end用来完成响应,可以带参数也可以不带,只能执行一次
        res.end(\'index\');      
    }else if(req.url.startsWith(\'/about\')){
        res.end(\'about\');
    }else{
        res.end(\'no content\');
    }
}).listen(3000,\'196.167.0.8\',() => {
    //此时不能再用localhost访问了,只能用IP地址:3000
    console.log(\'running...\');
});
/**
 * 响应完整的页面信息,先创建多个文件,利用路径分发功能分别对不同页面进行响应
 */
const http = require(\'http\');
const path = require(\'path\');
const fs = require(\'fs\');
//根据路径读取文件的内容,并且相应到浏览器
//抽取出来作为单独的一个方法
let readFile = (url,res) => {
    fs.readFile(path.join(__dirname,url),\'utf8\',(err,fileContent) => {
        if(err){
            res.end(\'server error\');
        }else{
            res.end(fileContent);
        }
    });
}
//处理路径分发
http.createServer((req,res) => {
    if(req.url.startsWith(\'/index\')){
        readFile(\'index.html\',res);
    }else if(req.url.startsWith(\'/about\')){
        readFile(\'about.html\',res);
    }else if(req.url.startsWith(\'/list\')){
        readFile(\'list.html\',res);
    }else{
        //设置相应类型和编码,否则没有响应投不能正常跳转
        res.writeHead(200, { \'Content-Type\': \'text/plain; charset=utf8\'});
        res.end(\'404 not found\');
    }
}).listen(3000,\'196.167.0.8\',() => {
    //此时不能再用localhost访问了,只能用IP地址:3000
    console.log(\'running...\');
});

随着页面分支越来越多,上述方式不够灵活,应该根据url去获取这个文件(利用req.url获取到的是端口号后面的路径)

/**
 * 路径分发的改进
 */
const http = require(\'http\');
const path = require(\'path\');
const fs = require(\'fs\');
//引入mime模块,作用就是根据url的后缀,返回对应的Content-Type,或者你传递Content-Type,它返回对应的文件类型的后缀
//安装mime模块:npm install mime --save
const mime = require(\'mime\');
//处理路径分发
http.createServer((req,res) => {
    fs.readFile(path.join(__dirname,req.url),(err,fileContent) => {
        if(err){
            //没有找到对应文件
            //设置响应头信息,避免出现乱码
            res.writeHead(404,{
                \'Content-Type\':\'text/plain;charset=utf8\'
            });
            //res.writeHead(404, { \'Content-Type\': \'text/plain; charset=utf8\'});
            res.end(\'页面丢失了\');
        }else{
            //获取请求文件的后缀
            //默认类型:
            //let dType = \'text/html\';
            //let ext = path.extname(req.url);
            //console.log(ext);
            //console.log(mime[ext]);
            //console.log(mime.getType(path.join(__dirname,req.url)));
            //如果哟请求的文件后缀合理,就获取到标准的响应格式
            //如果mime里面存在这个后缀,则覆盖默认的后缀类型
            //这种做法不行,一直处在默认类型,进不了这个循环
            /* if(mime[ext]){
                dType = mime[ext];
            } */
       //mime.getType(filePath)
            let dType = mime.getType(path.join(__dirname,req.url));
            //如果是文本类型,则需要设置其编码类型
            if(dType.startsWith(\'text\')){
                dType += \';charset=utf8\'
            }
            //设置响应头信息
            res.writeHead(200,{\'Content-Type\':dType});
            res.end(fileContent);
        }
    });
}).listen(3000,() => {
  console.log(\'running...\');
});

为了对静态资源服务器这个功能进行优化,可以将这部分功能抽取成一个独立的模块,方便以后使用。

/**
 * 抽取模块:01.js文件
 */
const http = require(\'http\');
const path = require(\'path\');
const fs = require(\'fs\');
const mime = require(\'mime\');
//root表示文件的根路径
exports.staticServer = (req,res,root) => {
    fs.readFile(path.join(root,req.url),(err,fileContent) => {
        if(err){
            //没有找到对应文件
            //设置响应头信息,避免出现乱码
            res.writeHead(404,{
                \'Content-Type\':\'text/plain;charset=utf8\'
            });
            //res.writeHead(404, { \'Content-Type\': \'text/plain; charset=utf8\'});
            res.end(\'页面丢失了\');
        }else{let dType = mime.getType(path.join(__dirname,req.url));
            //如果是文本类型,则需要设置其编码类型
            if(dType.startsWith(\'text\')){
                dType += \';charset=utf8\'
            }
            //设置响应头信息
            res.writeHead(200,{\'Content-Type\':dType});
            res.end(fileContent);
        }
    });
}
/**
 * 测试模块:02.js文件
 */
const http = require(\'http\');
const path = require(\'path\');
const ss = require(\'./03.js\');
http.createServer((req,res) => {
    ss.staticServer(req,res,path.join(__dirname));
}).listen(3000,() => {
    console.log(\'running...\');
  });

 

以上是关于静态资源服务器功能的主要内容,如果未能解决你的问题,请参考以下文章

使用Express快速搭建静态资源服务器

静态资源服务器功能

使用node搭建静态资源服务器

支持动态或静态片段的不同屏幕尺寸?

SpringBoot2----拦截器和文件上传功能

webpack工具