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入门详解(多篇文章结合)
Mar 07 NodeJs
NodeJS的模块写法入门(实例代码)
Mar 07 NodeJs
windows系统下简单nodejs安装及环境配置
Jan 08 NodeJs
NodeJS Express框架中处理404页面一个方式
May 28 NodeJs
Nodejs实现的一个简单udp广播服务器、客户端
Sep 25 NodeJs
基于NodeJS的前后端分离的思考与实践(五)多终端适配
Sep 26 NodeJs
Nodejs初级阶段之express
Nov 23 NodeJs
实例详解Nodejs 保存 payload 发送过来的文件
Jan 14 NodeJs
Jquery通过ajax请求NodeJS返回json数据实例
Nov 08 NodeJs
详解nodejs中express搭建权限管理系统
Sep 15 NodeJs
nodeJS模块简单用法示例
Apr 21 NodeJs
nodejs微信开发之接入指南
Mar 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
在smarty模板中使用PHP函数的方法
2011/04/23 PHP
PHP 之Section与Cookie使用总结
2012/09/14 PHP
Javascript的构造函数和constructor属性
2010/01/09 Javascript
两个JavaScript jsFiddle JSBin在线调试器
2010/03/14 Javascript
jquery 事件冒泡的介绍以及如何阻止事件冒泡
2012/12/25 Javascript
简单的两种Extjs formpanel加载数据的方式
2013/11/09 Javascript
javascript中parentNode,childNodes,children的应用详解
2013/12/17 Javascript
jQuery中toggle()函数的使用实例
2015/04/17 Javascript
Javascript中arguments用法实例分析
2015/06/13 Javascript
js文本框走动跑马灯效果代码分享
2015/08/25 Javascript
纯javascript移动优先的幻灯片效果
2015/11/02 Javascript
jQuery实现二级下拉菜单效果
2016/01/05 Javascript
JavaScript中值类型和引用类型的区别
2017/02/23 Javascript
Angular 数据请求的实现方法
2018/05/07 Javascript
vue 路由嵌套高亮问题的解决方法
2018/05/17 Javascript
详解vue-cli 构建项目 vue-cli请求后台接口 vue-cli使用axios、sass、swiper
2018/05/28 Javascript
手淘flexible.js框架使用和源代码讲解小结
2018/10/15 Javascript
vue实现的上拉加载更多数据/分页功能示例
2019/05/25 Javascript
jQuery表单选择器用法详解
2019/08/22 jQuery
[02:34]DOTA2英雄基础教程 幽鬼
2014/01/02 DOTA
在Django的模型中执行原始SQL查询的方法
2015/07/21 Python
go和python变量赋值遇到的一个问题
2017/08/31 Python
python使用epoll实现服务端的方法
2018/10/16 Python
Python批量生成幻影坦克图片实例代码
2019/06/04 Python
python matplotlib饼状图参数及用法解析
2019/11/04 Python
使用Python实现画一个中国地图
2019/11/23 Python
python cookie反爬处理的实现
2020/11/01 Python
python推导式的使用方法实例
2021/02/28 Python
荷兰电脑专场:Paradigit
2018/05/05 全球购物
匡威德国官网:Converse德国
2019/01/26 全球购物
采购部主管岗位职责
2014/01/01 职场文书
创建精神文明单位实施方案
2014/03/08 职场文书
小区的门卫岗位职责
2014/10/01 职场文书
html5表单的required属性使用
2021/07/07 HTML / CSS
带你了解CSS基础知识,样式
2021/07/21 HTML / CSS
js中Map和Set的用法及区别实例详解
2022/02/15 Javascript