从零开始,在windows上用nodejs搭建一个静态文件服务器

首先安装nodejs:

  • 新建一个node文件夹
  • 下载node.exe到该文件夹
  • 下载npm然后解压到该文件夹
  • 现在node文件夹是这样的
  • 把该目录加入到path环境变量
  • 在命令行执行

    node -v
    
    npm -v
    

    如果得到了版本号则表示nodejs安装完成

  • 在命令行中执行

    npm config set registry https://registry.npm.taobao.org
    

    以后安装nodejs模块 都会从淘宝的npm镜像中下载

  • 如果想要发布自己的模块到npm要先把npm的registry切换回来

    npm config set registry https://registry.npmjs.org
    

接下来搭建静态文件服务器

  • 创建一个文件夹server,一个文件夹root,server内是服务器的js代码,root是根目录
  • server文件夹里面创建js文件 index.js mime.js server.js
  • index.js

    var server = require(‘./server.js‘);
    var cp = require(‘child_process‘);
    var rootpath = ‘root‘;
    var sv = server.create({
        port: ‘9587‘,
        host: ‘127.0.0.1‘,
        root: rootpath
    });
    cp.exec(‘explorer http://127.0.0.1:9587‘, function () {
    });
    

      

  • mime.js

    var types = {
        "css": "text/css",
        "less": "text/css",
        "gif": "image/gif",
        "html": "text/html",
        "ejs": "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",
        "default": "text/plain"
    };
    module.exports = function (ext) {
        return types[ext] || ‘text/plain‘
    }
    
  • server.js

    var http = require(‘http‘);
    var path = require(‘path‘);
    var fs = require(‘fs‘);
    var url = require("url");
    var mime = require(‘./mime.js‘);
    
    function getPromise(cbk) {
        return (new Promise(cbk));
    }
    exports.create = function (opts) {
        var root = opts.root;
        var sv = http.createServer();
    
        function request(request, response) {
            var pathname = decodeURIComponent(url.parse(request.url).pathname);
            var realPath = path.resolve(path.join(root, pathname));//请求的实际路径
            getPromise(function (resolve, reject) {
                fs.exists(realPath, function (isExists) {//判断路径是否存在
                    isExists ? resolve() : reject();
                });
            }).catch(function () {
                resWrite(response, ‘404‘, ‘html‘, ‘<h1>404</h1>file or dir : <h3>‘ + pathname + ‘</h3>not found‘);
            }).then(function () {
                return getPromise(function (resolve, reject) {
                    fs.stat(realPath, function (err, stat) {//判断路径是文件还是文件夹
                        if (err) {
                            reject(err);
                        } else {
                            resolve(stat);
                        }
                    })
                }).then(function (stat) {
                    if (stat.isFile()) {//路径对应的是一个文件
                        resFile(response, realPath);
                    } else if (stat.isDirectory()) {//路径对应的是一个文件夹
                        var defaultIndexPath = path.resolve(realPath, ‘index.html‘);
                        return getPromise(function (resolve, reject) {
                            fs.exists(defaultIndexPath, function (isExists) {
                                if (isExists) {//如果该文件夹内有index.html
                                    resolve(true);
                                } else {//该文件夹内没有index.html 则 显示该文件夹的内容列表
                                    resolve(false);
                                }
                            })
                        }).then(function (isExistsIndex) {
                            if (isExistsIndex) {
                                resFile(response, defaultIndexPath);
                            } else {
                                return getPromise(function (resolve, reject) {
                                    fs.readdir(realPath, function (err, list) {
                                        if (err) {
                                            reject(err);
                                        } else {
                                            resolve(list);
                                        }
                                    })
                                }).then(function (list) {
                                    var pmlist = list.map(function (item) {
                                        return (new Promise(function (resolve, reject) {
                                            fs.stat(path.resolve(realPath, item), function (err, stat) {
                                                if (err) {
                                                    console.error(err);
                                                    resolve(‘‘);
                                                } else if (stat.isFile()) {
                                                    resolve(`<li class="file"><a href="${item}">${item}</a></li>`);
                                                } else if (stat.isDirectory()) {
                                                    resolve(`<li class="dir"><a href="${item}/">${item}</a></li>`);
                                                } else {
                                                    resolve(‘‘);
                                                }
                                            })
                                        }));
                                    });
                                    Promise.all(pmlist).then(function (linkList) {
                                        var links = ‘<ul>‘;
                                        links += ‘<li class="dir"><a href="../">../</a></li>‘;
                                        links += linkList.join(‘‘);
                                        links += ‘</ul>‘;
                                        var dirPage = `
    <!doctype html>
    <html>
    <head>
    <meta charset="utf-8"/>
        <style>
            a{color:blue;text-decoration: none;}
            .dir a{color:orange}
        </style>
    </head>
    <body>
        ${links}
    </body>
    </html>
    `;
                                        resWrite(response, ‘200‘, ‘html‘, dirPage);
                                    });
                                }).catch(function (err) {
                                    resWrite(response, ‘500‘, ‘default‘, err.toString());
                                })
                            }
                        })
                    } else {//既不是文件也不是文件夹
                        resWrite(response, ‘404‘, ‘html‘, ‘<h1>404</h1>file or dir : <h3>‘ + pathname + ‘</h3>not found‘);
                    }
                }).catch(function (err) {
                    resWrite(response, ‘500‘, ‘default‘, err.toString());
                })
            })
        }
    
        sv.on(‘request‘, request);
        sv.listen(opts.port, opts.host);
        return sv;
    };
    
    function resFile(response, realPath) {//输出一个文件
        fs.readFile(realPath, function (err, data) {
            if (err) {
                resWrite(response, ‘500‘, ‘default‘, err.toString());
            } else {
                var ext = path.extname(realPath).toLocaleLowerCase();
                ext = (ext ? ext.slice(1) : ‘unknown‘);
                resWrite(response, ‘200‘, ext, data);
            }
        });
    }
    
    function resWrite(response, statusCode, mimeKey, data) {
        response.writeHead(statusCode, {‘Content-Type‘: mime(mimeKey)});
        response.end(data);
    }
    
  • 在server文件夹内按住shift按钮,鼠标右键点击文件夹内空白区域,点击在此处打开命令窗口,执行命令

    node index.js
    
时间: 2024-11-01 19:15:50

从零开始,在windows上用nodejs搭建一个静态文件服务器的相关文章

windows上使用mkdocs搭建静态博客

windows上使用mkdocs搭建静态博客 之前尝试过用HEXO搭建静态博客,最近发现有个叫mkdocs的开源项目也是搭建静态博客的好选择,而且它支持markdown格式,下面简要介绍一下mkdocs的环境搭建过程 项目地址:https://github.com/mkdocs/mkdocs 介绍:英文版----http://www.mkdocs.org/ 中文版----http://markdown-docs-zh.readthedocs.io/zh_CN/latest/ 使用环境:win8.

用nodejs搭建一个简单的服务器

使用nodejs搭建一个简单的服务器 nodejs优点:性能高(读写文件) 数据操作能力强 官网:www.nodejs.org 验证是否安装成功:cmd命令行中输入node -v 如果显示版本号表示安装成功 [常用命令] 切换盘符 d:进入文件夹 cd nodejs返回上一级目录 cd..清屏 cls展示目录 dir复制文件名 选中右键--复制历史操作 上箭头 执行文件 node 文件名(在文件文件夹目录中)停止命令行 ctrl+c nodejs可以使用的ECMAScript.读写文件.数据库操

Python和Django在Windows上的环境搭建

作为一个.NET程序员,真心不喜欢Python以及PHP这种弱类型的语言.有人说,程序员应该多学几门语言,本想学习Java,无奈感觉Java的语法太啰嗦了.很多人都推荐Python,说它的语法简洁,执行效率高.趁这两天空闲,开始学习Python. 先从搭建环境开始.作为一个Python初学者来说,一个趁手的编译器是很重要的,本想用VS来开发Python,但是感觉实际开发中没有几家公司会用VS来开发Python,没办法就换成了MyEclipse. 一.首先下载和安装Myeclipse就略过了. 二

IceScrum在Windows上的平台搭建,ZT

IceScrum在Windows上的平台搭建 http://www.cnblogs.com/wenhaizhang/archive/2013/05/12/3074906.html

使用 Nodejs 搭建一个简单的Web服务器

使用Nodejs搭建Web服务器是学习Node.js比较全面的入门教程,因为要完成一个简单的Web服务器,你需要学习Nodejs中几个比较重要的模块,比如:http协议模块.文件系统.url解析模块.路径解析模块.以及301重定向问题,下面我们就简单讲一下如何来搭建一个简单的Web服务器. 作为一个Web服务器应具备以下几个功能: 1.能显示以.html/.htm结尾的Web页面 2.能直接打开以.js/.css/.json/.text结尾的文件内容 3.显示图片资源 4.自动下载以.apk/.

用nodejs搭建一个简单的服务监听程序

作为一个从业三年左右的,并且从事过半年左右PHP开发工作的前端,对于后台,尤其是对以js语言进行开发的nodejs,那是比较有兴趣的,虽然本身并没有接触过相关的工作,只是自己私下做的一下小实验,但是还是记录一下方便以后复习! 今天主要记录一下,很久以前用nodejs制作一个简单的服务监听程序的一些过程! 大家都知道,通过nodejs可以对前台请求进行监听,这里就放一个官网的hello world例子吧: var http = require('http'); http.createServer(

Windows上SVN服务器搭建【转】

Subversion是优秀的版本控制工具,其具体的的优点和详细介绍,这里就不再多说.本文介绍Windows上 VisualSVN server 服务端和 TortoiseSVN客户端搭配使用: 现在Subversion已经迁移到apache网站上了,下载地址:http://subversion.apache.org/packages.html TortoiseSVN客户端官网下载地址:http://tortoisesvn.net/downloads.html 先安装VisualSVN serve

如何使用nodejs搭建一个简单的https服务器

为什么要使用HTTPS服务 个人隐私以及安全的原因 https是未来的趋势 HTTPS的组成 HTTPS = HTTP + TLS/SSL 简单来说在http上套上了一层加密的ssl层 HTTPS的基本原理 Nodejs搭建HTTPS服务 生成HTTPS证书 引入HTTPS模块 指定证书位置,并创建https服务 实战案例 去网上去申请https的证书 vim https_server.js "use strict" // 引入模块 var https = require("

[Nodejs] node实现静态文件服务器

node 静态文件处理 一般后端进行静态文件处理都是使用 Apache nginx 等静态 web 服务器,但是既然使用 node 了,就用 node 实现以下静态服务器吧. 之前弄了不少充满艺术的数据,就弄个页面进行艺术欣赏吧 app.js "/": (request, response) => { response.writeHead(200, { "content-type": "text/html;charset=utf-8" })