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 相关文章推荐
windows系统下简单nodejs安装及环境配置
Jan 08 NodeJs
nodejs教程之环境安装及运行
Nov 21 NodeJs
Nodejs如何复制文件
Mar 09 NodeJs
Nodejs中 npm常用命令详解
Jul 04 NodeJs
Nodejs下DNS缓存问题浅析
Nov 16 NodeJs
nodejs开发——express路由与中间件
Mar 24 NodeJs
nodejs模块nodemailer基本使用-邮件发送示例(支持附件)
Mar 28 NodeJs
详解nodejs微信公众号开发——1.接入微信公众号
Apr 10 NodeJs
详解NODEJS基于FFMPEG视频推流测试
Nov 17 NodeJs
nodejs中express入门和基础知识点学习
Sep 13 NodeJs
详解nodejs解压版安装和配置(带有搭建前端项目脚手架)
Dec 06 NodeJs
Nodejs实现用户注册功能
Apr 14 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
用PHP写的MySQL数据库用户认证系统代码
2007/03/22 PHP
PHP fopen 读取带中文URL地址的一点见解
2012/09/25 PHP
php+mongodb判断坐标是否在指定多边形区域内的实例
2016/10/28 PHP
PHP实现时间比较和时间差计算的方法示例
2017/07/24 PHP
Yii 使用intervention/image拓展实现图像处理功能
2019/06/22 PHP
datePicker——日期选择控件(with jquery)
2007/02/20 Javascript
给moz-firefox下添加IE方法和属性
2007/04/10 Javascript
getElementById在任意一款浏览器中都可以用吗的疑问回复
2007/05/13 Javascript
Javascript 错误处理的几种方法
2009/06/13 Javascript
javascript xml为数据源的下拉框控件
2009/07/07 Javascript
asm.js使用示例代码
2013/11/28 Javascript
JavaScript开发人员的10个关键习惯小结
2014/12/05 Javascript
jquery控制表单输入框显示默认值的方法
2015/05/22 Javascript
js实现接收表单的值并将值拼在表单action后面的方法
2015/11/23 Javascript
深入解析Backbone.js框架的依赖库Underscore.js的作用
2016/05/07 Javascript
jQuery Dialog 打开时自动聚焦的解决方法(两种方法)
2016/11/24 Javascript
JS仿京东移动端手指拨动切换轮播图效果
2020/04/10 Javascript
bootstrap table表格客户端分页实例
2017/08/07 Javascript
vue 将页面公用的头部组件化的方法
2017/12/18 Javascript
Vue绑定内联样式问题
2018/10/17 Javascript
VUE实现密码验证与提示功能
2019/10/18 Javascript
Javascript中的this,bind和that使用实例
2019/12/05 Javascript
[31:00]2014 DOTA2华西杯精英邀请赛5 24 NewBee VS iG
2014/05/25 DOTA
[13:38]2015国际邀请赛中国战队出征仪式
2015/05/29 DOTA
简单的Python的curses库使用教程
2015/04/11 Python
Python2中的raw_input() 与 input()
2015/06/12 Python
Python图像灰度变换及图像数组操作
2016/01/27 Python
python使用正则表达式替换匹配成功的组并输出替换的次数
2017/11/22 Python
详解python3中zipfile模块用法
2018/06/18 Python
python 移动图片到另外一个文件夹的实例
2019/01/10 Python
对Django url的几种使用方式详解
2019/08/06 Python
Python中的四种交换数值的方法解析
2019/11/18 Python
诚信考试承诺书
2014/03/27 职场文书
电子专业自荐信
2014/07/01 职场文书
预备党员转正材料
2014/12/19 职场文书
给老婆的道歉信
2015/01/20 职场文书