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 相关文章推荐
PHPStorm 2020.1 调试 Nodejs的多种方法详解
Sep 17 NodeJs
nodejs文件操作模块FS(File System)常用函数简明总结
Jun 05 NodeJs
Nodejs极简入门教程(三):进程
Oct 27 NodeJs
NodeJS学习笔记之(Url,QueryString,Path)模块
Jan 13 NodeJs
Nodejs的express使用教程
Nov 23 NodeJs
nodejs服务搭建教程 nodejs访问本地站点文件
Apr 07 NodeJs
使用nodejs爬取前程无忧前端技能排行
May 06 NodeJs
CentOS 安装NodeJS V8.0.0的方法
Jun 15 NodeJs
nodeJS(express4.x)+vue(vue-cli)构建前后端分离实例(带跨域)
Jul 05 NodeJs
nodejs实现解析xml字符串为对象的方法示例
Mar 14 NodeJs
如何让Nodejs支持H5 History模式(connect-history-api-fallback源码分析)
May 30 NodeJs
nodejs各种姿势断点调试的方法
Jun 18 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
收音机发烧友应当熟知的100条知识
2021/03/02 无线电
php使用pdo连接mssql server数据库实例
2014/12/25 PHP
PHP文件上传操作实例详解
2016/09/27 PHP
微信封装的调用微信签名包的类库
2017/06/08 PHP
javascript下查找父节点的简单方法
2007/08/13 Javascript
Javascript条件判断使用小技巧总结
2008/09/08 Javascript
javascript返回顶部效果(自写代码)
2013/01/06 Javascript
jQuery ajax serialize()方法的使用以及常见问题解决
2013/01/27 Javascript
浅谈javascript中createElement事件
2014/12/05 Javascript
jquery制作属于自己的select自定义样式
2015/11/23 Javascript
JS数组合并push与concat区别分析
2015/12/17 Javascript
js弹出框、对话框、提示框、弹窗实现方法总结(推荐)
2016/05/31 Javascript
详谈JS中实现种子随机数及作用
2016/07/19 Javascript
js替换字符串中所有指定的字符(实现代码)
2016/08/17 Javascript
jQuery通过ajax快速批量提交表单数据
2016/10/25 Javascript
BootStrap的两种模态框方式
2017/05/10 Javascript
详解如何使用webpack打包Vue工程
2017/05/27 Javascript
ES6中数组array新增方法实例总结
2017/11/07 Javascript
在vue中添加Echarts图表的基本使用教程
2017/11/22 Javascript
微信小程序实现弹出菜单功能
2018/06/12 Javascript
详解使用WebPack搭建React开发环境
2019/08/06 Javascript
小程序点击图片实现png转jpg
2019/10/22 Javascript
Python version 2.7 required, which was not found in the registry
2014/08/26 Python
Python IDLE入门简介
2017/12/08 Python
为什么选择python编程语言入门黑客攻防 给你几个理由!
2018/02/02 Python
python正则表达式匹配不包含某几个字符的字符串方法
2019/07/23 Python
英国最大的在线运动补充剂商店:Discount Supplements
2017/06/03 全球购物
英国礼品和生活方式品牌:Treat Republic
2020/11/21 全球购物
便利店投资创业计划书
2014/02/08 职场文书
总会计师岗位职责
2014/02/19 职场文书
艾滋病宣传活动总结
2014/05/08 职场文书
安全生产标语
2014/06/06 职场文书
关于对大人不礼貌的检讨书
2014/09/29 职场文书
市场调研项目授权委托书范本
2014/10/04 职场文书
战马观后感
2015/06/08 职场文书
Python字典的基础操作
2021/11/01 Python