在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的url截取模块url-extract的使用实例
Nov 18 NodeJs
搭建简单的nodejs http服务器详解
Mar 09 NodeJs
nodejs个人博客开发第七步 后台登陆
Apr 12 NodeJs
解析NodeJS异步I/O的实现
Apr 13 NodeJs
nodejs制作爬虫实现批量下载图片
May 19 NodeJs
浅析 NodeJs 的几种文件路径
Jun 07 NodeJs
使用vs code开发Nodejs程序的使用方法
Sep 21 NodeJs
NodeJs项目中关闭ESLint的方法
Aug 09 NodeJs
windows如何把已安装的nodejs高版本降级为低版本(图文教程)
Dec 14 NodeJs
nodejs处理tcp连接的核心流程
Feb 26 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中请求url的五种方法总结
2017/07/13 PHP
Laravel 解决419错误 -ajax请求错误的问题(CSRF验证)
2019/10/25 PHP
jQuery获取css z-index在各种浏览器中的返回值
2010/09/15 Javascript
jQuery焦点图切换简易插件制作过程全纪录
2014/08/27 Javascript
jQuery中queue()方法用法实例
2014/12/29 Javascript
JavaScript前补零操作实例
2015/03/11 Javascript
jquery实现像栅栏一样左右滑出式二级菜单效果代码
2015/08/24 Javascript
JS非Alert实现网页右下角“未读信息”效果弹窗
2015/09/26 Javascript
CSS中position属性之fixed实现div居中
2015/12/14 Javascript
理解JavaScript表单的基础知识
2016/01/25 Javascript
jQuery实现的兼容性浮动层示例
2016/08/02 Javascript
深入理解Vue官方文档梳理之全局API
2017/11/22 Javascript
关于laydate.js加载laydate.css路径错误问题解决
2017/12/27 Javascript
vue组件间的参数传递实例详解
2019/04/26 Javascript
JsonServer安装及启动过程图解
2020/02/28 Javascript
微信小程序获取公众号文章列表及显示文章的示例代码
2020/03/10 Javascript
JS原型prototype和__proto__用法实例分析
2020/03/14 Javascript
vue项目启动出现cannot GET /服务错误的解决方法
2020/04/26 Javascript
Python功能键的读取方法
2015/05/28 Python
使用Python的urllib2模块处理url和图片的技巧两则
2016/02/18 Python
Python基于二分查找实现求整数平方根的方法
2016/05/12 Python
python搭建服务器实现两个Android客户端间收发消息
2018/04/12 Python
python 数字类型和字符串类型的相互转换实例
2018/07/17 Python
python文件操作之批量修改文件后缀名的方法
2018/08/10 Python
python入门:这篇文章带你直接学会python
2018/09/14 Python
python读取TXT每行,并存到LIST中的方法
2018/10/26 Python
Python使用psutil获取进程信息的例子
2019/12/17 Python
将matplotlib绘图嵌入pyqt的方法示例
2020/01/08 Python
python下载的库包存放路径
2020/07/27 Python
解决H5的a标签的download属性下载service上的文件出现跨域问题
2019/07/16 HTML / CSS
事业单位请假制度
2014/01/13 职场文书
令人印象深刻的自荐信
2014/05/25 职场文书
英文感谢信格式
2015/01/21 职场文书
2015年高校教师个人工作总结
2015/05/25 职场文书
关于教师节的广播稿
2015/08/19 职场文书
Html分层的box-shadow效果的示例代码
2021/03/30 HTML / CSS