Nodejs实现的一个静态服务器实例

参考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"
};

(0)

相关推荐

  • 使用nodejs、Python写的一个简易HTTP静态文件服务器

    日常开发过程中,我们经常需要修改一些放在 CDN 上的静态文件(如 JavaScript.CSS.HTML 文件等),这个过程中,我们希望能有一种方式将线上 CDN 的目录映射为本地硬盘上的某个目录,这样,当我们在本地修改了某个文件时,不需要发布,刷新后马上能看到效果. 比如,我们的 CDN 域名是:http://a.mycdn.com,本地对应的目录是:D:\workassets,我们希望所有对 http://a.mycdn.com/* 的访问被映射到本地的 D:\workassets\* 下

  • 轻松创建nodejs服务器(10):处理POST请求

    目前为止,我们做的服务器没有实际的用处,接下来我们开始实现一些实际有用的功能. 我们要做的是:用户选择一个文件,上传该文件,然后在浏览器中看到上传的文件. 首先我们需要一个文本区(textarea)供用户输入内容,然后通过POST请求提交给服务器. 我们在start事件处理器里添加代码,requestHandlers.js修改如下: 复制代码 代码如下: function start(response) {  console.log("Request handler 'start' was ca

  • 轻松创建nodejs服务器(4):路由

    服务器需要根据不同的URL或请求来执行不一样的操作,我们可以通过路由来实现这个步骤. 第一步我们需要先解析出请求URL的路径,我们引入url模块. 我们来给onRequest()函数加上一些逻辑,用来找出浏览器请求的URL路径: 复制代码 代码如下: var http = require("http"); var url = require("url"); function start() {  function onRequest(request, respons

  • 轻松创建nodejs服务器(1):一个简单nodejs服务器例子

    我们先来实现一个简单的例子,hello world. 似乎每种语言教程的第一节都会讲这个,我们也不例外. 首先我们先创建一个项目目录,目录可自己定义,本案例的目录为 e:/nodetest/. 由于我们要搭建的是服务器,所以我把第一个文件命名为server.js. 在server.js里面输入以下代码: 复制代码 代码如下: var http = require("http");   http.createServer(function(request, response) {    

  • 搭建简单的nodejs http服务器详解

    搭建简单的nodejs服务器 通过一些简单配置我们就可以搭建一台基于nodejs的http服务器 通过switch配置url路由的方法 // 这是一个简单的Node HTTP服务器,能处理当前目录的文件 // 并能实现两种特殊的URL用于测试 // 用HTTP://localhost:8000或http://127.0.0.1:8000连接这个服务器 // 首先加载所有需要用到的模块 var http = require('http'); // 加载http服务api模块 var fs = re

  • Nodejs实现的一个简单udp广播服务器、客户端

    nodejs发送udp广播还是蛮简单的,我们先写个服务器用于接收广播数据,代码如下: 复制代码 代码如下: var dgram = require("dgram"); var server = dgram.createSocket("udp4"); server.on("error", function (err) {   console.log("server error:\n" + err.stack);   server

  • 轻松创建nodejs服务器(10):处理上传图片

    本节我们将实现,用户上传图片,并将该图片在浏览器中显示出来. 这里我们要用到的外部模块是Felix Geisendörfer开发的node-formidable模块.它对解析上传的文件数据做了很好的抽象. 要安装这个外部模块,需在cmd下执行命令: 复制代码 代码如下: npm install formidable 如果输出类似的信息就代表安装成功了: 复制代码 代码如下: npm info build Success: formidable@1.0.14 安装成功后我们用request将其引入

  • NodeJS学习笔记之Http模块

    一,开篇分析 首先"Http"这个概念大家应该比较熟悉了,它不是基于特定语言的,是一个通用的应用层协议,不同语言有不同的实现细节,但是万变不离其宗,思想是相同的, NodeJS作为一个宿主运行环境,以JavaScript为宿主语言,它也有自己实现的一套标准,这篇文章我们就一起来学习一下 "Http模块" .但是作为前提来说, 希望大家可以先阅读一下官网提供的api,有一个前置了解,这样就方便多了,以下是Http部分的api概览: 复制代码 代码如下: HTTP   

  • 抛弃Nginx使用nodejs做反向代理服务器

    时下不少场景,都是申请一个 VPS 主机来托管运行 Web 项目的,小弟我也不例外,购买了一个小型的 Win 03 VPS 使用着.在使用的过程中,面临一个问题,就是同一类型的服务端环境还好--但如果是一个 PHP.一个 ASP. 一个 JSP 的三种类型的服务端项目并存着,该怎么分配唯一的 80 端口呢?因为商业 WWW 网站的话,往往只能占用 80  端口,--当然,如果只是做服务的话,如接口之类的,使用其他端口就不会与 80 端口冲突了.许多开发者都会面临到 80 端口这个问题,并且实际情

  • NodeJS创建最简单的HTTP服务器

    ☆ 引子 var http = require('http'); http.createServer(function(request, response){ response.writeHead(200, { 'Content-Type': 'text-plain' }); response.end('Hello World\n'); }).listen(8124); 对这个http这个最顶层的对象有个.createServer服务器的方法. 创建了一个服务器,跟服务器相关的就两个事件. 请求

随机推荐