在windows上用nodejs搭建静态文件服务器的简单方法


Posted in NodeJs onAugust 11, 2016

在windows上用nodejs搭建一个静态文件服务器,即使你一点基础没有也能学会nodejs静态文件服务器的搭建,本文介绍的非常详细,很适合零基础入门的朋友学习。

首先安装nodejs:

•新建一个node文件夹

•下载node.exe到该文件夹

•下载npm然后解压到该文件夹

•现在node文件夹是这样的

在windows上用nodejs搭建静态文件服务器的简单方法

•把该目录加入到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 rootpath = 'root';
var sv = server.create({
port: '9587',
host: '127.0.0.1',
root: rootpath
}); 
•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

以上所述是小编给大家介绍的在windows上用nodejs搭建静态文件服务器的简单方法,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!

NodeJs 相关文章推荐
我的NodeJs学习小结(一)
Jul 06 NodeJs
Nodejs学习笔记之Stream模块
Jan 13 NodeJs
Nodejs爬虫进阶教程之异步并发控制
Feb 15 NodeJs
Nodejs下DNS缓存问题浅析
Nov 16 NodeJs
详谈Angular路由与Nodejs路由的区别
Mar 05 NodeJs
NodeJS处理Express中异步错误
Mar 26 NodeJs
详解Nodejs之静态资源处理
Jun 05 NodeJs
使用vs code开发Nodejs程序的使用方法
Sep 21 NodeJs
NodeJs实现定时任务的示例代码
Dec 05 NodeJs
nodejs连接mysql数据库及基本知识点详解
Mar 20 NodeJs
nodejs基础之多进程实例详解
Dec 27 NodeJs
nodeJS与MySQL实现分页数据以及倒序数据
Jun 05 NodeJs
Nodejs抓取html页面内容(推荐)
Aug 11 #NodeJs
用nodejs的实现原理和搭建服务器(动态)
Aug 10 #NodeJs
nodejs如何获取时间戳与时间差
Aug 03 #NodeJs
NodeJS与HTML5相结合实现拖拽多个文件上传到服务器的实现方法
Jul 26 #NodeJs
Nodejs从有门道无门菜鸟起飞必看教程
Jul 20 #NodeJs
nodejs加密Crypto的实例代码
Jul 07 #NodeJs
Nodejs中 npm常用命令详解
Jul 04 #NodeJs
You might like
hessian 在PHP中的使用介绍
2010/12/13 PHP
php header Content-Type类型小结
2011/07/03 PHP
PHP检测字符串是否为UTF8编码的常用方法
2014/11/21 PHP
php实现mysql数据库连接操作及用户管理
2015/11/08 PHP
php网页版聊天软件实现代码
2016/08/12 PHP
php的4种常用运行方式详解
2016/12/22 PHP
PHP封装函数实现生成随机的字符串验证码
2017/01/24 PHP
php判断数组是否为空的实例方法
2020/05/10 PHP
phpstorm最新激活码分享亲测phpstorm2020.2.3版可用
2020/11/22 PHP
利用google提供的API(JavaScript接口)获取网站访问者IP地理位置的代码详解
2010/07/24 Javascript
javascript-表格排序(降序/反序)实现介绍(附图)
2013/05/30 Javascript
jQuery通过ajax方法获取json数据不执行success的原因及解决方法
2016/10/15 Javascript
JQuery实现动态操作表格
2017/01/11 Javascript
React中ES5与ES6写法的区别总结
2017/04/21 Javascript
详解Vue CLI3 多页应用实践和源码设计
2018/08/30 Javascript
小程序云开发教程如何使用云函数实现点赞功能
2019/05/18 Javascript
python局域网ip扫描示例分享
2014/04/03 Python
Python 3中print函数的使用方法总结
2017/08/08 Python
python实现生命游戏的示例代码(Game of Life)
2018/01/24 Python
python批量获取html内body内容的实例
2019/01/02 Python
python实现同一局域网下传输图片
2020/03/20 Python
Pandas之read_csv()读取文件跳过报错行的解决
2020/04/21 Python
Python如何将函数值赋给变量
2020/04/28 Python
python实现测试工具(一)——命令行发送get请求
2020/10/19 Python
39美元购买一副眼镜或太阳镜:39DollarGlasses.com
2018/06/17 全球购物
家得宝官网:The Home Depot(全球最大的家居装饰专业零售商)
2018/12/17 全球购物
招商业务员岗位职责
2013/12/16 职场文书
关于十八大的演讲稿
2014/09/15 职场文书
关于有小孩的离婚协议书
2014/10/26 职场文书
党的群众路线教育实践活动先进个人材料
2014/12/24 职场文书
高三英语复习计划
2015/01/19 职场文书
文案策划岗位职责
2015/02/11 职场文书
《将心比心》教学反思
2016/02/23 职场文书
教你怎么用Python处理excel实现自动化办公
2021/04/30 Python
《遗弃》开发商删推文要跑路?官方回应:还在开发
2022/04/03 其他游戏
Apache SkyWalking 监控 MySQL Server 实战解析
2022/09/23 Servers