代码
var http = require("http");
var url = require("url");
var path = require("path");
var mime = require("mime");
var fs = require("fs");
var urlencode = require('urlencode');
http.createServer(function(req, res){
var pathname = url.parse(req.url).pathname;
pathname = urlencode.decode(pathname, 'utf-8');
if(pathname == "/favicon.ico") return;
finalpath = __dirname + pathname;
fs.exists(finalpath,function(exists){
if(exists){
if(fs.statSync(finalpath).isDirectory()){
fs.readdir(finalpath,function(err,files){
if(err){
res.writeHead(200,{"Content-Type":'text/plain'});
res.end("<h1>404 page cannot be found</h1>");
}
else{
var html = "<head><meta charset='utf-8'></head>";
var files = fs.readdirSync(finalpath);
for (var i in files) {
var filename = files[i];
html += "<div ><h2><a href='http://127.0.0.1:8088" +
pathname + '/'+ filename + "'>" + filename + "</a></h2></div>";
}
res.writeHead(200, {'content-type': 'text/html'});
res.end(html);
}
})
}
else if(fs.statSync(finalpath).isFile()){
fs.readFile(finalpath,function(err,data){
if(err) {res.end("cannot read file!");}
else {
res.writeHead(200,{"Content-Type":mime.getType(path.basename)});
res.end(data);
}
})
}
else{
res.writeHead(200,{"Content-Type":"text/html;charset=utf-8"});
res.end("<h1>404 page cannot be found!</h1>");
}
}
})
}).listen(8088);
截图
总结
虽然这个实验比较简单,但是还是查了好多资料,debug了好久,总结总结:
- 认识了版本管理工具nvm和包管理工具npm(对应python的pip)
- 服务器是个进程,创建了一个服务器后它会一直监听一个端口,等待请求,在收到url请求后会根据服务器程序逻辑处理参数、路径等信息相应的返回请求的资源(本程序返回的是html或一些文件的显示或下载)服务器是个进程,创建了一个服务器后它会一直监听一个端口,等待请求,在收到url请求后会根据服务器程序逻辑处理参数、路径等信息相应的返回请求的资源(本程序返回的是html或一些文件的显示或下载)
- 异步可以理解为事件触发,同步则是顺序执行
- JavaScript导模块的形式和python的import…as很类似,都会给模块取名
- 理解服务当前所在地址、路径名和绝对路径的区别
- 注意解析客服端请求的url并将其转换成资源管理器上的路径时要先对url进行解码
- 体会到了console.log对于调试的巨大作用
html += "<div ><h2><a href='http://127.0.0.1:8088" +
pathname + '/'+ filename + "'>" + filename + "</a></h2>
这段代码实现了程序的核心功能,一定要注意超链接跳转是对于客户来说的,客户端完成click事件后相当于向服务器发送了一个请求,所以链接应当是一个url(: 前面一直写成本地的资源管理器路径怎么点超链接都没有反应,查了好久才反应过来,被自己菜哭
参考资料
(1)get start
Node.js-Webstorm2018配置nodejs
(2)mime
【Node.js基础篇】(五)使用mime模块来响应css、js文件的请求
nodejs-mime类型
(3)fs
NodeJS遍历文件生产文件列表
搭建nodejs服务,访问本地站点文件
(4)url
NodeJS解析url参数
node 中,url.parse(req.url).pathname 和 req.url 的区别
(5)urlencode
Nodejs urlencode模块url加密解密
(6)实例
如何使用nodejs 服务器读取HTML文件渲染至前端
node静态资源服务器的搭建----访问本地文件夹(搭建可访问静态文件的服务器)