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中使用monk访问mongodb
Jul 06 NodeJs
基于NodeJS的前后端分离的思考与实践(二)模版探索
Sep 26 NodeJs
NodeJS制作爬虫全过程(续)
Dec 22 NodeJs
nodejs URL模块操作URL相关方法介绍
Mar 03 NodeJs
Nodejs实现批量下载妹纸图
May 28 NodeJs
Nodejs如何搭建Web服务器
Mar 28 NodeJs
详解nodejs微信公众号开发——1.接入微信公众号
Apr 10 NodeJs
NodeJS设计模式总结【单例模式,适配器模式,装饰模式,观察者模式】
Sep 06 NodeJs
nodeJs爬虫的技术点总结
May 13 NodeJs
详解nodejs 开发企业微信第三方应用入门教程
Mar 12 NodeJs
nodejs和react实现即时通讯简易聊天室功能
Aug 21 NodeJs
nodejs实现UDP组播示例方法
Nov 04 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
ob_start(),ob_start('ob_gzhandler')使用
2006/12/25 PHP
解析PHP中的内存管理,PHP动态分配和释放内存
2013/06/28 PHP
php生成图形(Libchart)实例
2013/11/06 PHP
php获取汉字首字母的函数
2013/11/07 PHP
PHP模板引擎Smarty内建函数foreach,foreachelse用法分析
2016/04/11 PHP
php实现微信和支付宝支付的示例代码
2020/08/11 PHP
麻雀虽小五脏俱全 Dojo自定义控件应用
2010/09/04 Javascript
基于jquery的blockui插件显示弹出层
2011/04/14 Javascript
利用jquery的获取JS文件中的字符串内容
2012/02/14 Javascript
浅析JQuery UI Dialog的样式设置问题
2013/12/18 Javascript
一个获取第n个元素节点的js函数
2014/09/02 Javascript
jQuery mobile转换url地址及获取url中目录部分的方法
2015/12/04 Javascript
JavaScript中利用jQuery绑定事件的几种方式小结
2016/03/06 Javascript
JavaScript驾驭网页-获取网页元素
2016/03/24 Javascript
JavaScrip数组删除特定元素的几种方法总结
2017/09/06 Javascript
AngularJS实现的省市二级联动功能示例【可对选项实现增删】
2017/10/26 Javascript
浅谈Vue网络请求之interceptors实际应用
2018/02/28 Javascript
微信小程序图片自适应实现解析
2020/01/21 Javascript
跟老齐学Python之坑爹的字符编码
2014/09/28 Python
Python中比较特别的除法运算和幂运算介绍
2015/04/05 Python
python numpy函数中的linspace创建等差数列详解
2017/10/13 Python
python编程之requests在网络请求中添加cookies参数方法详解
2017/10/25 Python
python抓取搜狗微信公众号文章
2019/04/01 Python
Python中字典与恒等运算符的用法分析
2019/08/22 Python
Python包,__init__.py功能与用法分析
2020/01/07 Python
Python实现常见的几种加密算法(MD5,SHA-1,HMAC,DES/AES,RSA和ECC)
2020/05/09 Python
将python字符串转化成长表达式的函数eval实例
2020/05/11 Python
python文件读取失败怎么处理
2020/06/23 Python
canvas实现按住鼠标移动绘制出轨迹的示例代码
2018/02/05 HTML / CSS
艺术用品:Arteza
2018/11/25 全球购物
毕业生文员求职信
2013/11/03 职场文书
幼儿园大班毕业教师寄语
2014/04/03 职场文书
小班上学期评语
2014/05/05 职场文书
法人委托书范本格式
2014/09/15 职场文书
实习协议书
2015/01/27 职场文书
蓬莱阁导游词
2015/02/04 职场文书