静态资源服务器功能

/**
 * 静态服务器功能:核心模块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...‘);
  });

原文地址:https://www.cnblogs.com/zcy9838/p/11616751.html

时间: 2024-11-01 11:48:24

静态资源服务器功能的相关文章

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

在上一篇使用node搭建静态资源服务器(1)中,我们已经实现了基本的功能,下面继续实现进阶功能. 静态资源的压缩 //compress.js module.exports = (rs,req,res) => { const acceptEncoding = req.headers['accept-encoding']; if(!acceptEncoding || !acceptEncoding.match(/\b(gzip|defalte)\b/)) { return rs; }else if(

【学习Koa】原生koa2 静态资源服务器例子

实现思路 首先读取当前路径下所有的文件和文件夹 当去点击某个列表项时判断其实文件还是文件夹,文件的话直接读取,文件夹则再次利用上一个步骤读取并展示 文件结构 代码 index.js 入口文件 const Koa = require('koa') const path = require('path') const getContent = require('./util/content') const mimes = require('./util/mimes') const app = new

Nginx——静态资源服务器(一)

java web的项目中,我们经常将项目部署到Tomcat或者jetty上,可以通过Tomcat或者jetty启动的服务来访问静态资源.但是随着Nginx的普及,用Nginx来作为静态资源服务器,似乎有着更高的性能.接下来的Nginx--静态资源服务器系列随笔,我想探讨以下几个问题: Nginx作为静态资源服务器,有什么优势? Nginx如何和tomcat结合起来使用? Nginx如何搭建CDN? 等等 静态资源是指非服务器运行动态生成的文件,主要包括浏览器端渲染(html.css.js).图片

web站点优化之使用tengine搭建静态资源服务器和静态资源合并加载案例剖析

在一个项目还是单体架构的时候,所有的js,css,image都会在一个web网站上,看起来并没有什么问题,比如下面这样: 但是当web网站流量起来的时候,这个单体架构必须要进行横向扩展,而在原来的架构中静态资源这羊毛是出在单体架构这头羊身上,所以横向多少 个单体,就有多少个静态资源文件夹,比如下面这样的架构. 那这种架构有什么问题呢? 总的来说会有如下二个问题: 1.   浏览器对单一域名的请求有并发限制. 在同一个域名下,一般来说有js,css,img,media,html等等静态资源,如果资

图片等静态资源服务器的设计和应用

最近网站需要上传一些图片,于是考虑做一个专门管理静态资源的服务: 归纳的实现有几点: 1,使用jsonp或http跨域上传(文件流传输): 2,本地上传并服务器之间同步: 3,本地上传,做目录映射(IIS?) 后来看到阿里云的OSS,小手一抖便注册使用了,只需要上传就可以访问了,不需要额外部署应用服务器,有java sdk,于是乎...(未完待续) 相关链接: http://www.aliyun.com/ http://free.aliyun.com/?tracelog=ECSmokuai#OS

nginx静态资源服务器简单配置

有时候我们可以把服务器的一些文件放在固定目录以便下载,比如image,css,js等.就可以使用nginx转发静态资源. 参考链接:https://blog.csdn.net/name_is_wl/article/details/52958472 原文地址:https://www.cnblogs.com/2YSP/p/9262539.html

HTTP静态资源服务器搭建

1.搭建服务器原因 前后端分离已成为互联网项目开发的业界标准使用方式,通过nginx+tomcat的方式(也可以中间加一个nodejs)有效的进行解耦,并且前后端分离会为以后的大型分布式架构.弹性计算架构.微服务架构.多端化服务(多种客户端,例如:浏览器,车载终端,安卓,IOS等等)打下坚实的基础.这个步骤是系统架构从猿进化成人的必经之路. 核心思想是前端html页面通过ajax调用后端的restuful api接口并使用json数据进行交互. 在互联网架构中: Web服务器:一般指像nginx

nginx搭建静态资源服务器遇到403 Forbidden

1.在nginx中配置静态服务器 server { listen 91; server_name localhost; location / { root /root/software/qingfeng; index index.html; } } 这是我放静态资源的/root/software/qingfeng目录(注意:我这放在/root目录下) 我启动nginx时访问   ip地址:91时,访问不了,报403 Forbidden错误 2.我又从新在nginx中配置静态服务器 server

linux使用Nginx搭建静态资源服务器

最近公司需要做一个宣传片播放  视频有点大 好几百M 就想到使用Nginx来代理静态资源,在过程中出现了一些问题,比如端口没开.访问是403等,没有成功,后面慢慢查找问题,才发现大部分博客资料的都不全,所以在这里记录一下. 安装过程本文就不提了 网上都有很多 本文主要说明 nginx.conf 的配置 如下: 进入编辑nginx.conf 文件 输入密码 配置nginx.conf 上传文件到配置的路径 在网页地址栏输入对应的地址 如果出现 nginx静态资源文件无法访问,403 forbidde