在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全栈框架StrongLoop推荐
Nov 09 NodeJs
轻松创建nodejs服务器(7):阻塞操作的实现
Dec 18 NodeJs
Jquery通过ajax请求NodeJS返回json数据实例
Nov 08 NodeJs
Nodejs下用submit提交表单提示cannot post错误的解决方法
Nov 21 NodeJs
nodejs操作mysql实现增删改查的实例
May 28 NodeJs
详解nodeJS之路径PATH模块
May 31 NodeJs
详解HTTPS 的原理和 NodeJS 的实现
Jul 04 NodeJs
nodejs 使用http进行post或get请求的实例(携带cookie)
Jan 03 NodeJs
独立部署小程序基于nodejs的服务器过程详解
Jun 24 NodeJs
nodejs使用Sequelize框架操作数据库的实现
Oct 21 NodeJs
nodejs中的异步编程知识点详解
Jan 17 NodeJs
NodeJs内存占用过高的排查实战记录
May 10 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
dedecms后台验证码总提示错误的解决方法
2007/03/21 PHP
修改ThinkPHP缓存为Memcache的方法
2014/06/25 PHP
验证用户是否修改过页面的数据的实现方法
2008/09/26 Javascript
JS setCapture 区域外事件捕捉
2010/03/18 Javascript
Javascript 中 null、NaN和undefined的区别总结
2013/04/10 Javascript
用javascript关闭本窗口技巧小结
2014/09/05 Javascript
jQuery实现的数值范围range2dslider选取插件特效多款代码分享
2015/08/27 Javascript
详解JavaScript逻辑And运算符
2015/12/04 Javascript
教你用javascript实现随机标签云效果_附代码
2016/03/16 Javascript
如何用JavaScript实现动态修改CSS样式表
2016/05/20 Javascript
JQuery动态添加Select的Option元素实现方法
2016/08/29 Javascript
浅谈jquery高级方法描述与应用
2016/10/04 Javascript
BootStrap3中模态对话框的使用
2017/01/06 Javascript
详解Vue 动态组件与全局事件绑定总结
2018/11/11 Javascript
react ant Design手动设置表单的值操作
2020/10/31 Javascript
Python中生成器和yield语句的用法详解
2015/04/17 Python
在Django框架中运行Python应用全攻略
2015/07/17 Python
Python 和 JS 有哪些相同之处
2017/11/23 Python
Python+matplotlib+numpy实现在不同平面的二维条形图
2018/01/02 Python
Python 可变类型和不可变类型及引用过程解析
2019/09/27 Python
Python入门基础之数字字符串与列表
2021/02/01 Python
任意一块网页内容实现“活”的背景(目前火狐浏览器专有)
2014/05/07 HTML / CSS
css3 transform及原生js实现鼠标拖动3D立方体旋转
2016/06/20 HTML / CSS
HTML5中input[type='date']自定义样式与日历校验功能的实现代码
2017/07/11 HTML / CSS
捷克钓鱼用品网上商店:Parys.cz
2018/06/15 全球购物
Pretty Little Thing美国:时尚女性服饰
2018/08/27 全球购物
俄罗斯汽车零件和配件在线商店:CarvilleShop
2019/11/29 全球购物
户外婚礼策划方案
2014/02/08 职场文书
勤奋学习演讲稿
2014/05/10 职场文书
护理专业自我评价
2015/03/11 职场文书
《伯牙绝弦》教学反思
2016/02/16 职场文书
《棉鞋里的阳光》教学反思
2016/02/20 职场文书
用Python提取PDF表格的方法
2021/04/11 Python
巧用 -webkit-box-reflect 倒影实现各类动效(小结)
2021/04/22 HTML / CSS
MySQL获取所有分类的前N条记录
2021/05/07 MySQL
win10识别不了U盘怎么办 win10系统读取U盘失败的解决办法
2022/08/05 数码科技