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实用示例 缩址还原
Dec 28 NodeJs
nodejs文件操作模块FS(File System)常用函数简明总结
Jun 05 NodeJs
nodejs教程之入门
Nov 21 NodeJs
nodejs创建web服务器之hello world程序
Aug 20 NodeJs
Nodejs全局安装和本地安装的不同之处
Jul 04 NodeJs
nodejs中全局变量的实例解析
Mar 07 NodeJs
NodeJS基础API搭建服务器详细过程记录
Apr 01 NodeJs
修改Nodejs内置的npm默认配置路径方法
May 13 NodeJs
nodejs中函数的调用实例详解
Oct 31 NodeJs
深入理解nodejs搭建静态服务器(实现命令行)
Feb 05 NodeJs
如何让Nodejs支持H5 History模式(connect-history-api-fallback源码分析)
May 30 NodeJs
nodejs对项目下所有空文件夹创建gitkeep的方法
Aug 02 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
一个简单实现多条件查询的例子
2006/10/09 PHP
php实现过滤UBB代码的类
2015/03/12 PHP
curl和libcurl的区别简介
2015/07/01 PHP
PHP MYSQL实现登陆和模糊查询两大功能
2016/02/05 PHP
PHP入门教程之数学运算技巧总结
2016/09/11 PHP
laravel实现前后台路由分离的方法
2019/10/13 PHP
PHP如何使用array_unshift()在数组开头插入元素
2020/09/01 PHP
用于table内容排序
2006/07/21 Javascript
Javascript调用C#代码
2011/01/17 Javascript
图片Slider 带左右按钮的js示例
2013/08/30 Javascript
使用jquery修改表单的提交地址基本思路
2014/06/04 Javascript
JS实现的颜色实时渐变效果完整实例
2016/03/25 Javascript
轻松掌握jQuery中wrap()与unwrap()函数的用法
2016/05/24 Javascript
微信小程序 用户数据解密详细介绍
2017/01/09 Javascript
JS获取鼠标位置距浏览器窗口距离的方法示例
2017/04/11 Javascript
微信小程序实现点击图片旋转180度并且弹出下拉列表
2018/11/27 Javascript
vue下的@change事件的实现
2019/10/25 Javascript
vue项目中监听手机物理返回键的实现
2020/01/18 Javascript
vue 路由守卫(导航守卫)及其具体使用
2020/02/25 Javascript
JavaScript 实现轮播图特效的示例
2020/11/05 Javascript
Python中__name__的使用实例
2015/04/14 Python
Django的URLconf中使用缺省视图参数的方法
2015/07/18 Python
Python3实战之爬虫抓取网易云音乐的热门评论
2017/10/09 Python
pandas中Timestamp类用法详解
2017/12/11 Python
python 实现敏感词过滤的方法
2019/01/21 Python
详解Python的爬虫框架 Scrapy
2020/08/03 Python
python smtplib发送多个email联系人的实现
2020/10/09 Python
女子锻炼服装和瑜伽服装:Splits59
2019/03/04 全球购物
幼师专业求职推荐信
2013/11/08 职场文书
护士演讲稿范文
2014/01/05 职场文书
户外活动总结范文
2014/04/30 职场文书
文明班集体申报材料
2014/05/23 职场文书
县委务虚会发言材料
2014/10/20 职场文书
群众路线教育实践活动学习笔记
2014/11/05 职场文书
2015年度校学生会工作总结报告
2015/05/23 职场文书
火锅店的开业营销方案范本!
2019/07/05 职场文书