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实现黑名单中间件设计
Jun 17 NodeJs
Nodejs sublime text 3安装与配置
Jun 19 NodeJs
nodejs 实现模拟form表单上传文件
Jul 14 NodeJs
nodejs实现邮件发送服务实例分享
Mar 29 NodeJs
详解Windows下安装Nodejs步骤
May 18 NodeJs
关于Mac下安装nodejs、npm和cnpm的教程
Apr 11 NodeJs
nodejs基础之常用工具模块util用法分析
Dec 26 NodeJs
Nodejs异步流程框架async的方法
Jun 07 NodeJs
typescript nodejs 依赖注入实现方法代码详解
Jul 21 NodeJs
关于NodeJS中的循环引用详解
Jul 23 NodeJs
Nodejs实现WebSocket代码实例
May 19 NodeJs
浅谈JS和Nodejs中的事件驱动
May 05 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自定义的格式化时间示例代码
2013/12/05 PHP
PHP json_decode函数详细解析
2014/02/17 PHP
php中Array2xml类实现数组转化成XML实例
2014/12/08 PHP
Thinkphp5.0 框架Model模型简单用法分析
2019/10/11 PHP
PHP实现递归的三种方法
2020/07/04 PHP
JS启动应用程序的一个简单例子
2008/05/11 Javascript
ExtJS 工具栏 分页事件参数
2010/03/05 Javascript
JavaScript Date对象 日期获取函数
2010/12/19 Javascript
Jquery 复选框取值兼容FF和IE8(测试有效)
2013/10/29 Javascript
浅谈Javascript中匀速运动的停止条件
2014/12/19 Javascript
JS实现选择TextArea内文本的方法
2015/08/03 Javascript
JavaScript构造函数详解
2015/12/27 Javascript
微信小程序 中wx.chooseAddress(OBJECT)实例详解
2017/03/31 Javascript
详解基于Node.js的微信JS-SDK后端接口实现代码
2017/07/15 Javascript
Django中使用jquery的ajax进行数据交互的实例代码
2017/10/15 jQuery
JS中的两种数据类型及实现引用类型的深拷贝的方法
2018/08/12 Javascript
独立部署小程序基于nodejs的服务器过程详解
2019/06/24 NodeJs
React-redux实现小案例(todolist)的过程
2019/09/29 Javascript
基于Web Audio API实现音频可视化效果
2020/06/12 Javascript
[03:04]2018年国际邀请赛典藏宝瓶&莱恩声望物品展示 片尾有彩蛋
2018/06/04 DOTA
自己使用总结Python程序代码片段
2015/06/02 Python
Anaconda+VSCode配置tensorflow开发环境的教程详解
2020/03/30 Python
如何基于Python Matplotlib实现网格动画
2020/07/20 Python
澳大利高级泳装品牌:Bondi Born
2018/05/23 全球购物
Groupon西班牙官方网站:在线优惠券和交易,节省高达70%
2021/03/13 全球购物
接口的多继承会带来哪些问题
2015/08/17 面试题
JAVA程序设计笔试题面试题一套
2015/07/28 面试题
报社实习生自荐信
2014/01/24 职场文书
劳动实践课感言
2014/02/01 职场文书
旅游管理毕业生自荐信范文
2014/03/19 职场文书
安全生产专项整治方案
2014/05/06 职场文书
电子商务专业自荐信
2014/06/02 职场文书
公司员工活动策划方案
2014/08/20 职场文书
捐款通知怎么写
2015/04/24 职场文书
安全教育培训制度
2015/08/06 职场文书
windows server 2016 域环境搭建的方法步骤(图文)
2022/06/25 Servers