设为首页 收藏本站
查看: 943|回复: 0

[经验分享] 从零开始,在windows上用nodejs搭建一个静态文件服务器

[复制链接]

尚未签到

发表于 2017-2-24 10:39:14 | 显示全部楼层 |阅读模式
  从零开始,在windows上用nodejs搭建一个静态文件服务器
  首先安装nodejs:


  • 新建一个node文件夹
  • 下载node.exe到该文件夹
  • 下载npm然后解压到该文件夹
  • 现在node文件夹是这样的 DSC0000.jpg
  • 把该目录加入到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

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-346535-1-1.html 上篇帖子: 探讨Nodejs中的作用域问题。 下篇帖子: nodeJS中npm常见的命令
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表