node.js搭建文件服务器,从零开始,在windows上用nodejs搭建一个静态文件服务器

创建一个文件夹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', '

404

file or dir :

' + pathname + '

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(`

${item}`);

} else if (stat.isDirectory()) {

resolve(`

${item}`);

} else {

resolve('');

}

})

}));

});

Promise.all(pmlist).then(function (linkList) {

var links = '

  • ';

links += '

../';

links += linkList.join('');

links += '

';

var dirPage = `

a{color:blue;text-decoration: none;}

.dir a{color:orange}

${links}

`;

resWrite(response, '200', 'html', dirPage);

});

}).catch(function (err) {

resWrite(response, '500', 'default', err.toString());

})

}

})

} else {//既不是文件也不是文件夹

resWrite(response, '404', 'html', '

404

file or dir :

' + pathname + '

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值