Nodejs实现的一个静态服务器实例


Posted in NodeJs onDecember 06, 2014

参考cnodejs.org上面的静态服务器例子,写了下面的一个nodejs静态服务器例子,里面包含cache,压缩,贴代码如下:

/**

 * 静态文件服务器测试例子

 * User: xuwm

 * Date: 13-5-17

 * Time: 上午8:38

 * To change this template use File | Settings | File Templates.

 */

var port=3333;

var http = require("http");

var url = require("url");

var fs = require("fs");

var path = require("path");

var mime = require("./mime").types;

var config = require("./config");

var zlib = require("zlib");

//创建http服务端

var server=http.createServer(function(request,response){

    var obj= url.parse(request.url);

    response.setHeader("Server","Node/V8");

    console.log(obj);

    var pathname=obj.pathname;

    if(pathname.slice(-1)==="/"){

        pathname=pathname+config.Welcome.file;   //默认取当前默认下的index.html

    }

    var realPath = path.join("assets", path.normalize(pathname.replace(/\.\./g, "")));

    console.log(realPath) ;

    var pathHandle=function(realPath){

    //用fs.stat方法获取文件

        fs.stat(realPath,function(err,stats){

            if(err){

                response.writeHead(404,"not found",{'Content-Type':'text/plain'});

                response.write("the request "+realPath+" is not found");

                response.end();

            }else{

                if(stats.isDirectory()){

                }else{

                    var ext = path.extname(realPath);

                    ext = ext ? ext.slice(1) : 'unknown';

                    var contentType = mime[ext] || "text/plain";

                    response.setHeader("Content-Type", contentType);
                    var lastModified = stats.mtime.toUTCString();

                    var ifModifiedSince = "If-Modified-Since".toLowerCase();

                    response.setHeader("Last-Modified", lastModified);
                    if (ext.match(config.Expires.fileMatch)) {

                        var expires = new Date();

                        expires.setTime(expires.getTime() + config.Expires.maxAge * 1000);

                        response.setHeader("Expires", expires.toUTCString());

                        response.setHeader("Cache-Control", "max-age=" + config.Expires.maxAge);

                    }
                    if (request.headers[ifModifiedSince] && lastModified == request.headers[ifModifiedSince]) {

                        console.log("从浏览器cache里取")

                        response.writeHead(304, "Not Modified");

                        response.end();

                    } else {

                        var raw = fs.createReadStream(realPath);

                        var acceptEncoding = request.headers['accept-encoding'] || "";

                        var matched = ext.match(config.Compress.match);
                        if (matched && acceptEncoding.match(/\bgzip\b/)) {

                            response.writeHead(200, "Ok", {'Content-Encoding': 'gzip'});

                            raw.pipe(zlib.createGzip()).pipe(response);

                        } else if (matched && acceptEncoding.match(/\bdeflate\b/)) {

                            response.writeHead(200, "Ok", {'Content-Encoding': 'deflate'});

                            raw.pipe(zlib.createDeflate()).pipe(response);

                        } else {

                            response.writeHead(200, "Ok");

                            raw.pipe(response);

                        }

                    }

                }

            }

        });
    }

    pathHandle(realPath);

});

server.listen(port);

console.log("http server run in port:"+port);

首先需要在JS文件里创建一个assets的文件夹,里面放入你要浏览的静态文件,比如,index.html,demo.js等。

运行方式为:在命令行里切换到上面的JS的文件目录,然后输入 node JS文件名

浏览器内输入http://localhost:3333/就会看到效果。

--补上上面代码里缺少的两个模块

mime.js

exports.types = {
  "css": "text/css",
  "gif": "image/gif",
  "html": "text/html",
  "ico": "image/x-icon",
  "jpeg": "image/jpeg",
  "jpg": "image/jpeg",
  "js": "text/javascript",
  "json": "application/json",
  "pdf": "application/pdf",
  "png": "image/png",
  "svg": "image/svg+xml",
  "swf": "application/x-shockwave-flash",
  "tiff": "image/tiff",
  "txt": "text/plain",
  "wav": "audio/x-wav",
  "wma": "audio/x-ms-wma",
  "wmv": "video/x-ms-wmv",
  "xml": "text/xml"

};

config.js

exports.Expires = {

    fileMatch: /^(gif|png|jpg|js|css)$/ig,

    maxAge: 60 * 60 * 24 * 365

};
exports.Compress = {

    match: /css|js|html/ig

};
exports.Welcome = {

    file: "index.html"

};
NodeJs 相关文章推荐
nodejs获取本机内网和外网ip地址的实现代码
Jun 01 NodeJs
使用Nodejs开发微信公众号后台服务实例
Sep 03 NodeJs
NodeJS中利用Promise来封装异步函数
Feb 25 NodeJs
深入浅析Nodejs的Http模块
Jun 20 NodeJs
Nodejs 复制文件/文件夹的方法
Aug 24 NodeJs
nodejs 最新版安装npm 的使用详解
Jan 18 NodeJs
nodejs微信开发之自动回复的实现
Mar 17 NodeJs
详解Nodejs get获取远程服务器接口数据
Mar 26 NodeJs
详解NodeJs项目 CentOs linux服务器线上部署
Sep 16 NodeJs
NodeJs内存占用过高的排查实战记录
May 10 NodeJs
nodejs利用readline提示输入内容实例代码
Jul 15 NodeJs
使用 Koa + TS + ESLlint 搭建node服务器的过程详解
May 30 NodeJs
nodejs中简单实现Javascript Promise机制的实例
Dec 06 #NodeJs
nodejs实现的一个简单聊天室功能分享
Dec 06 #NodeJs
详谈nodejs异步编程
Dec 04 #NodeJs
nodejs下打包模块archiver详解
Dec 03 #NodeJs
nodejs中转换URL字符串与查询字符串详解
Nov 26 #NodeJs
nodejs教程之制作一个简单的文章发布系统
Nov 21 #NodeJs
nodejs教程之环境安装及运行
Nov 21 #NodeJs
You might like
常用表单验证类,有了这个,一般的验证就都齐了。
2006/12/06 PHP
php xml文件操作代码(一)
2009/03/20 PHP
PHP中使用虚代理实现延迟加载技术
2014/11/05 PHP
Js点击弹出下拉菜单效果实例
2013/08/12 Javascript
Jquery焦点图实例代码
2014/11/25 Javascript
JQuery实现左右滚动菜单特效
2015/09/28 Javascript
基于Bootstrap实现Material Design风格表单插件 附源码下载
2016/04/18 Javascript
js表单序列化判断空值的实例
2017/09/22 Javascript
js JSON.stringify()基础详解
2019/06/19 Javascript
基于layui内置模块(element常用元素的操作)
2019/09/20 Javascript
使用Vue.set()方法实现响应式修改数组数据步骤
2019/11/09 Javascript
微信小程序用户盒子、宫格列表的实现
2020/07/01 Javascript
[02:15]2014DOTA2国际邀请赛 赛后退役选手回顾
2014/08/01 DOTA
Python简单实现自动删除目录下空文件夹的方法
2017/08/29 Python
python logging日志模块的详解
2017/10/29 Python
python实现TF-IDF算法解析
2018/01/02 Python
使用Python爬取最好大学网大学排名
2018/02/24 Python
Python入门学习指南分享
2018/04/11 Python
解决Python print 输出文本显示 gbk 编码错误问题
2018/07/13 Python
解决pycharm回车之后不能换行或不能缩进的问题
2019/01/16 Python
提升Python程序性能的7个习惯
2019/04/14 Python
python logging 日志的级别调整方式
2020/02/21 Python
python爬虫开发之使用python爬虫库requests,urllib与今日头条搜索功能爬取搜索内容实例
2020/03/10 Python
浅谈Keras的Sequential与PyTorch的Sequential的区别
2020/06/17 Python
在keras里实现自定义上采样层
2020/06/28 Python
python3.7 openpyxl 在excel单元格中写入数据实例
2020/09/01 Python
Python用摘要算法生成token及检验token的示例代码
2020/12/01 Python
html5 canvas绘制矩形和圆形的实例代码
2016/06/16 HTML / CSS
美国新兴城市生活方式零售商:VILLA
2017/12/06 全球购物
SIXPAD智能健身仪英国官网:革命性的训练装备品牌
2018/09/27 全球购物
班级旅游计划书
2014/05/03 职场文书
客房服务员岗位职责
2015/02/09 职场文书
中秋节寄语2015
2015/03/24 职场文书
董事会决议范本
2015/07/01 职场文书
Redis+Lua脚本实现计数器接口防刷功能(升级版)
2022/02/12 Redis
悬疑名作《朋友游戏》动画无字ED宣传片 新角色公开
2022/04/13 日漫