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的子进程(child_process)调用系统命令的方法分享
Jun 05 NodeJs
我的NodeJs学习小结(一)
Jul 06 NodeJs
Nodejs实战心得之eventproxy模块控制并发
Oct 27 NodeJs
nodejs修复ipa处理过的png图片
Feb 17 NodeJs
浅谈Nodejs中的作用域问题
Dec 26 NodeJs
nodejs socket实现的服务端和客户端功能示例
Jun 02 NodeJs
理解nodejs的stream和pipe机制的原理和实现
Aug 12 NodeJs
Nodejs+express+ejs简单使用实例代码
Sep 18 NodeJs
Mac 安装 nodejs方法(图文详细步骤)
Oct 30 NodeJs
Linux Centos7.2下安装nodejs&npm配置全局路径的教程
May 15 NodeJs
详解NodeJs项目 CentOs linux服务器线上部署
Sep 16 NodeJs
nodejs nedb 封装库与使用方法示例
Feb 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
[原创]效率较高的php下读取文本文件的代码
2008/07/02 PHP
单一index.php实现PHP任意层级文件夹遍历(Zjmainstay原创)
2012/07/31 PHP
php设计模式之简单工厂模式详解
2014/09/04 PHP
PHP中mysqli_affected_rows作用行数返回值分析
2014/12/26 PHP
自定义min版smarty模板引擎MinSmarty.class.php文件及用法
2016/05/20 PHP
PHP编写文件多服务器同步程序
2016/07/02 PHP
php版微信开发Token验证失败或请求URL超时问题的解决方法
2016/09/23 PHP
JavaScript高级程序设计(第3版)学习笔记13 ECMAScript5新特性
2012/10/11 Javascript
jquery text(),val(),html()方法区别总结
2013/11/04 Javascript
JS+CSS实现的竖向简洁折叠菜单效果代码
2015/10/22 Javascript
详解JavaScript基于面向对象之创建对象(1)
2015/12/10 Javascript
Node.js开发者必须了解的4个JS要点
2016/02/21 Javascript
基于Angularjs实现分页功能
2016/05/30 Javascript
jQuery Ajax使用FormData对象上传文件的方法
2016/09/07 Javascript
JQuery 动态生成Table表格实例代码
2016/12/02 Javascript
canvas实现粒子时钟效果
2017/02/06 Javascript
javascript验证香港身份证的格式或真实性
2017/02/07 Javascript
JavaScript中值类型和引用类型的区别
2017/02/23 Javascript
简单实现jQuery轮播效果
2017/08/18 jQuery
JS实现移动端整屏滑动的实例代码
2017/11/10 Javascript
angular写一个列表的选择全选交互组件的示例
2018/01/22 Javascript
详解react-redux插件入门
2018/04/19 Javascript
Vue.js 通过jQuery ajax获取数据实现更新后重新渲染页面的方法
2018/08/09 jQuery
微信小程序swiper实现滑动放大缩小效果
2018/11/15 Javascript
uniapp 仿微信的右边下拉选择弹出框的实现代码
2020/07/12 Javascript
Python随机生成数模块random使用实例
2015/04/13 Python
python将回车作为输入内容的实例
2018/06/23 Python
python 接收处理外带的参数方法
2018/12/03 Python
Django中自定义admin Xadmin的实现代码
2019/08/09 Python
python正则过滤字母、中文、数字及特殊字符方法详解
2020/02/11 Python
CSS3 3D旋转rotate效果实例介绍
2016/05/03 HTML / CSS
美国女士时尚珠宝及配饰购物网站:Icing
2018/07/02 全球购物
基层干部个人对照检查及整改措施
2014/10/28 职场文书
2015年敬老院工作总结
2015/05/18 职场文书
入党介绍人考察意见
2015/06/01 职场文书
浅谈Python数学建模之数据导入
2021/06/23 Python