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中转换URL字符串与查询字符串详解
Nov 26 NodeJs
使用nodejs开发cli项目实例
Jun 03 NodeJs
实例详解Nodejs 保存 payload 发送过来的文件
Jan 14 NodeJs
Windows 系统下设置Nodejs NPM全局路径
Apr 26 NodeJs
详解nodejs微信公众号开发——3.封装消息响应模块
Apr 10 NodeJs
nodejs入门教程二:创建一个简单应用示例
Apr 24 NodeJs
NodeJs使用Mysql模块实现事务处理实例
May 31 NodeJs
nodejs实现简单的gulp打包
Dec 21 NodeJs
nodejs 使用 js 模块的方法实例详解
Dec 04 NodeJs
nodejs文件夹深层复制功能
Sep 03 NodeJs
nodejs实现UDP组播示例方法
Nov 04 NodeJs
Nodejs技巧之Exceljs表格操作用法示例
Nov 06 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
Javascript 中的类和闭包
2010/01/08 Javascript
javascript 特性检测并非浏览器检测
2010/01/15 Javascript
javascript instanceof,typeof的区别
2010/03/24 Javascript
jQuery.extend()、jQuery.fn.extend()扩展方法示例详解
2014/05/08 Javascript
分享经典的JavaScript开发技巧
2015/11/21 Javascript
原生js实现百叶窗效果及原理介绍
2016/04/12 Javascript
bootstrap3 兼容IE8浏览器!
2016/05/02 Javascript
JS触摸屏网页版仿app弹窗型滚动列表选择器/日期选择器
2016/10/30 Javascript
Angular中ng-bind和ng-model的区别实例详解
2017/04/10 Javascript
原生JavaScript实现精美的淘宝轮播图效果示例【附demo源码下载】
2017/05/27 Javascript
JavaScript实现简单的双色球(实例讲解)
2017/07/31 Javascript
Angular4开发解决跨域问题详解
2017/08/28 Javascript
深入理解Node module模块
2018/03/26 Javascript
解决layui调用自定义方法提示未定义的问题
2019/09/14 Javascript
手把手15分钟搭一个企业级脚手架
2019/09/16 Javascript
Vue.js下拉菜单组件使用方法详解
2019/10/19 Javascript
Vue-resource安装过程及使用方法解析
2020/07/21 Javascript
编写v-for循环的技巧汇总
2020/12/01 Javascript
原生js 实现表单验证功能
2021/02/08 Javascript
使用Python的判断语句模拟三目运算
2015/04/24 Python
Python探索之SocketServer详解
2017/10/28 Python
Python爬虫之正则表达式基本用法实例分析
2018/08/08 Python
PyCharm使用Docker镜像搭建Python开发环境
2019/12/26 Python
解决Opencv+Python cv2.imshow闪退问题
2020/04/24 Python
python小白学习包管理器pip安装
2020/06/09 Python
matplotlib基础绘图命令之errorbar的使用
2020/08/13 Python
html5教程实现Photoshop渐变色效果
2013/12/04 HTML / CSS
一个精品风格的世界:Atterley
2019/05/01 全球购物
西安启天科技有限公司网络工程师面试题笔试题
2016/06/12 面试题
2014年健康教育实施方案
2014/02/17 职场文书
厉行勤俭节约倡议书
2014/05/16 职场文书
2014年团支书工作总结
2014/11/14 职场文书
学校扫黄打非工作总结
2015/10/15 职场文书
五星级酒店宣传口号
2015/12/25 职场文书
php 防护xss,PHP的防御XSS注入的终极解决方案
2021/04/01 PHP
使用CSS3实现按钮悬停闪烁动态特效代码
2021/08/30 HTML / CSS