在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 相关文章推荐
Google官方支持的NodeJS访问API,提供后台登录授权
Jul 29 NodeJs
Nodejs从有门道无门菜鸟起飞必看教程
Jul 20 NodeJs
nodejs和php实现图片访问实时处理
Jan 05 NodeJs
使用nodejs下载风景壁纸
Feb 05 NodeJs
基于Nodejs利用socket.io实现多人聊天室
Feb 22 NodeJs
详解nodejs微信公众号开发——5.素材管理接口
Apr 11 NodeJs
nodejs socket实现的服务端和客户端功能示例
Jun 02 NodeJs
关于Mac下安装nodejs、npm和cnpm的教程
Apr 11 NodeJs
Nodejs对postgresql基本操作的封装方法
Feb 20 NodeJs
监控Nodejs的性能实例代码
Jul 02 NodeJs
typescript nodejs 依赖注入实现方法代码详解
Jul 21 NodeJs
nodejs一个简单的文件服务器的创建方法
Sep 13 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
PHP Array交叉表实现代码
2010/08/05 PHP
PHP模块 Memcached功能多于Memcache
2011/06/14 PHP
php获取mysql字段名称和其它信息的例子
2014/04/14 PHP
PHP实现简易图形计算器
2020/08/28 PHP
javascript编程起步(第六课)
2007/01/10 Javascript
jQuery插件 tabBox实现代码
2010/02/09 Javascript
ko knockoutjs动态属性绑定技巧应用
2012/11/14 Javascript
javascript拖拽上传类库DropzoneJS使用方法
2013/12/05 Javascript
初步认识JavaScript函数库jQuery
2015/06/18 Javascript
js实现简单折叠、展开菜单的方法
2015/08/28 Javascript
网页从弹窗页面单选框传值至父页面代码分享
2015/09/29 Javascript
Ztree新增角色和编辑角色回显问题的解决
2016/10/25 Javascript
EasyUI框架 使用Ajax提交注册信息的实现代码
2017/09/27 Javascript
详解es6超好用的语法糖Decorator
2018/08/01 Javascript
vue实现微信分享链接添加动态参数的方法
2019/04/29 Javascript
JS实现碰撞检测效果
2020/03/12 Javascript
[00:42]《辉夜杯》—职业组预选赛12月3日15点 正式打响
2015/12/03 DOTA
[02:51]2018年度DOTA2最佳中单位选手-完美盛典
2018/12/17 DOTA
python用10行代码实现对黄色图片的检测功能
2015/08/10 Python
Python字符串拼接六种方法介绍
2017/12/18 Python
numpy中实现二维数组按照某列、某行排序的方法
2018/04/04 Python
Python实现查看系统启动项功能示例
2018/05/10 Python
tensorflow实现简单的卷积网络
2018/05/24 Python
Python IDE Pycharm中的快捷键列表用法
2019/08/08 Python
详解Pycharm出现out of memory的终极解决方法
2020/03/03 Python
python GUI计算器的实现
2020/10/09 Python
使用CSS Grid布局实现网格的流动
2014/12/30 HTML / CSS
亚洲最大旅游体验平台:KKday
2017/10/21 全球购物
大学生党课思想汇报
2013/12/29 职场文书
大学军训感言600字
2014/02/25 职场文书
社区五一劳动节活动总结
2015/02/09 职场文书
2015年乡镇发展党员工作总结
2015/03/31 职场文书
SQL SERVER中常用日期函数的具体使用
2021/04/08 SQL Server
Java使用Unsafe类的示例详解
2021/09/25 Java/Android
Spring Boot接口定义和全局异常统一处理
2022/04/20 Java/Android
JavaScript前端面试组合函数
2022/06/21 Javascript