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截取模块url-extract的使用实例
Nov 18 NodeJs
NodeJS学习笔记之Http模块
Jan 13 NodeJs
NodeJS中利用Promise来封装异步函数
Feb 25 NodeJs
nodejs调用cmd命令实现复制目录
May 04 NodeJs
nodejs操作mysql实现增删改查的实例
May 28 NodeJs
nodejs前端自动化构建环境的搭建
Jul 26 NodeJs
用nodejs实现json和jsonp服务的方法
Aug 25 NodeJs
nodejs实现的连接MySQL数据库功能示例
Jan 25 NodeJs
nodejs+mongodb aggregate级联查询操作示例
Mar 17 NodeJs
nodejs分离html文件里面的js和css的方法
Apr 09 NodeJs
Nodejs监听日志文件的变化的过程解析
Aug 04 NodeJs
nodejs中的异步编程知识点详解
Jan 17 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
用DBSQL类加快开发MySQL数据库程序的速度
2006/10/09 PHP
linux命令之调试工具strace的深入分析
2013/06/03 PHP
php获取微信共享收货地址的方法
2017/12/21 PHP
PHP实现浏览器中直接输出图片的方法示例
2018/03/14 PHP
php 实现简单的登录功能示例【基于thinkPHP框架】
2019/12/02 PHP
改善你的jQuery的25个步骤 千倍级效率提升
2010/02/11 Javascript
js模拟select下拉菜单控件的代码
2013/05/08 Javascript
javascript中验证大写字母、数字和中文
2014/01/15 Javascript
浅谈javascript对象模型和function对象
2014/12/26 Javascript
jquery左右全屏大尺寸多图滑动效果代码分享
2015/08/28 Javascript
jquery获取url参数及url加参数的方法
2015/10/26 Javascript
基于jQuery实现网页打印功能
2015/12/01 Javascript
Node.js 回调函数实例详解
2017/07/06 Javascript
微信小程序 scroll-view实现锚点滑动的示例
2017/12/06 Javascript
使用socket.io实现简单聊天室案例
2018/01/02 Javascript
解析vue data不可以使用箭头函数问题
2018/07/03 Javascript
详解Koa中更方便简单发送响应的方式
2018/07/20 Javascript
vue键盘事件点击事件加native操作
2020/07/27 Javascript
vue+flask实现视频合成功能(拖拽上传)
2021/03/04 Vue.js
使用Python的Twisted框架编写简单的网络客户端
2015/04/16 Python
Python入门教程之if语句的用法
2015/05/14 Python
剖析Python的Twisted框架的核心特性
2016/05/25 Python
Python简单定义与使用二叉树示例
2018/05/11 Python
python二维列表一维列表的互相转换实例
2018/07/02 Python
Django用户认证系统 组与权限解析
2019/08/02 Python
Python爬虫实现使用beautifulSoup4爬取名言网功能案例
2019/09/15 Python
django框架中间件原理与用法详解
2019/12/10 Python
pytorch获取模型某一层参数名及参数值方式
2019/12/30 Python
在CentOS7下安装Python3教程解析
2020/07/09 Python
大学生个人简历自荐信
2015/03/06 职场文书
员工手册编写范本
2015/05/14 职场文书
2016年秋季运动会通讯稿
2015/11/25 职场文书
《雷雨》教学反思
2016/02/20 职场文书
nginx实现发布静态资源的方法
2021/03/31 Servers
详解Redis基本命令与使用场景
2021/06/01 Redis
Javascript webpack动态import
2022/04/19 Javascript