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中require路径问题
May 07 NodeJs
nodejs初步体验篇
Nov 23 NodeJs
Nodejs Express4.x开发框架随手笔记
Nov 23 NodeJs
搭建简单的nodejs http服务器详解
Mar 09 NodeJs
Ajax异步文件上传与NodeJS express服务端处理
Apr 01 NodeJs
NodeJs安装npm包一直失败的解决方法
Apr 28 NodeJs
nodejs mysql 实现分页的方法
Jun 06 NodeJs
深入理解NodeJS 多进程和集群
Oct 17 NodeJs
nodejs和react实现即时通讯简易聊天室功能
Aug 21 NodeJs
NodeJS 文件夹拷贝以及删除功能
Sep 03 NodeJs
nodejs制作小爬虫功能示例
Feb 24 NodeJs
Nodejs实现WebSocket代码实例
May 19 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与函数式编程解释
2007/04/27 Javascript
JavaScript CSS菜单功能 改进版
2008/12/20 Javascript
js调用AJAX时Get和post的乱码解决方法
2013/06/04 Javascript
测试IE浏览器对JavaScript的AngularJS的兼容性
2015/06/19 Javascript
JS给Textarea文本框添加行号的方法
2015/08/20 Javascript
js前端解决跨域问题的8种方案(最新最全)
2016/11/18 Javascript
jQuery实现手机上输入后隐藏键盘功能
2017/01/04 Javascript
详解NodeJS框架express的路径映射(路由)功能及控制
2017/03/24 NodeJs
详解vue组件化开发-vuex状态管理库
2017/04/10 Javascript
简单易扩展可控性强的Jquery转盘抽奖程序
2019/03/16 jQuery
了解JavaScript表单操作和表单域
2019/05/27 Javascript
微信小程序实现日历小功能
2020/11/18 Javascript
全面解析Vue中的$nextTick
2020/12/24 Vue.js
vue实现按钮切换图片
2021/01/20 Vue.js
如何处理Python3.4 使用pymssql 乱码问题
2016/01/08 Python
Python正则表达式使用范例分享
2016/12/04 Python
Python 正则表达式入门(初级篇)
2016/12/07 Python
Python外星人入侵游戏编程完整版
2020/03/30 Python
Python tkinter的grid布局及Text动态显示方法
2018/10/11 Python
Python多进程写入同一文件的方法
2019/01/14 Python
使用python itchat包爬取微信好友头像形成矩形头像集的方法
2019/02/21 Python
如何运行.ipynb文件的图文讲解
2019/06/27 Python
python二进制文件的转译详解
2019/07/03 Python
Python实现朴素贝叶斯的学习与分类过程解析
2019/08/24 Python
Python中的单下划线和双下划线使用场景详解
2019/09/09 Python
pygame实现弹球游戏
2020/04/14 Python
用python打开摄像头并把图像传回qq邮箱(Pyinstaller打包)
2020/05/17 Python
python实现测试工具(二)——简单的ui测试工具
2020/10/19 Python
NBA欧洲商店(法国):NBA Europe Store FR
2016/10/19 全球购物
Pretty Little Thing美国:时尚女性服饰
2018/08/27 全球购物
绩效专员岗位职责
2013/12/02 职场文书
四年大学自我鉴定
2014/02/17 职场文书
岗位明星事迹材料
2014/05/18 职场文书
党支部考察意见范文
2015/06/02 职场文书
Spring boot应用启动后首次访问很慢的解决方案
2021/06/23 Java/Android
APP界面设计技巧和注意事项
2022/04/29 杂记