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全栈框架StrongLoop推荐
Nov 09 NodeJs
nodejs简单实现中英文翻译
May 04 NodeJs
nodejs基础知识
Feb 03 NodeJs
基于nodejs+express4.X实现文件下载的实例代码
Jul 13 NodeJs
nodejs async异步常用函数总结(推荐)
Nov 17 NodeJs
Nodejs下使用gm圆形裁剪并合成图片的示例
Feb 22 NodeJs
nodejs基于express实现文件上传的方法
Mar 19 NodeJs
nodejs读取本地中文json文件出现乱码解决方法
Oct 10 NodeJs
nodejs和react实现即时通讯简易聊天室功能
Aug 21 NodeJs
纯异步nodejs文件夹(目录)复制功能
Sep 03 NodeJs
Nodejs文件上传、监听上传进度的代码
Mar 27 NodeJs
Nodejs环境实现socket通信过程解析
Jul 03 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
ftp类(myftp.php)
2006/10/09 PHP
php以post形式发送xml的方法
2014/11/04 PHP
PHP使用自定义方法实现数组合并示例
2016/07/07 PHP
PHP编程获取各个时间段具体时间的方法
2017/05/26 PHP
ThinkPHP5框架实现简单的批量查询功能示例
2018/06/07 PHP
PHP中mysqli_get_server_version()的实例用法
2020/02/03 PHP
javascript 必知必会之closure
2009/09/21 Javascript
在标题栏显示新消息提示,很多公司项目中用到这个方法
2011/11/04 Javascript
jQuery实现可用于博客的动态滑动菜单
2015/03/09 Javascript
jQuery选择器源码解读(一):Sizzle方法
2015/03/31 Javascript
在AngularJS应用中实现一些动画效果的代码
2015/06/18 Javascript
JavaScript实现下拉菜单的显示和隐藏
2016/01/05 Javascript
AngularJS利用Controller完成URL跳转
2016/08/09 Javascript
使用JavaScript为一张图片设置备选路径的方法
2017/01/04 Javascript
常用jQuery选择器汇总
2017/02/02 Javascript
JS中LocalStorage与SessionStorage五种循序渐进的使用方法
2017/07/12 Javascript
Node.js学习之TCP/IP数据通讯(实例讲解)
2017/10/11 Javascript
利用百度地图API获取当前位置信息的实例
2017/11/06 Javascript
JavaScript 预解析的4种实现方法解析
2019/09/03 Javascript
浅谈Vue3.0之前你必须知道的TypeScript实战技巧
2019/09/11 Javascript
json解析大全 双引号、键值对不在一起的情况
2019/12/06 Javascript
JS数组转字符串实现方法解析
2020/09/04 Javascript
vue3.0自定义指令(drectives)知识点总结
2020/12/27 Vue.js
python实现计算资源图标crc值的方法
2014/10/05 Python
Python 实现向word(docx)中输出
2020/02/13 Python
Python动态导入模块和反射机制详解
2020/02/18 Python
布局和排版教程 纯css3实现图片三角形排列
2014/10/17 HTML / CSS
总结30个CSS3选择器
2017/04/13 HTML / CSS
中职生自我鉴定范文
2013/10/03 职场文书
应届生求职推荐信
2013/10/28 职场文书
20年同学聚会感言
2014/02/03 职场文书
学习型党组织建设经验材料
2014/05/26 职场文书
信息与计算机科学职业规划范文:成为一艘有方向的船
2014/09/11 职场文书
2015年仓库管理工作总结
2015/05/25 职场文书
2016年小学“我们的节日·中秋节”活动总结
2016/04/05 职场文书
Python基于百度API识别并提取图片中文字
2021/06/27 Python