Node.js实现简易版基于http的文件服务器

在这里插入图片描述

代码
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了好久,总结总结:

  1. 认识了版本管理工具nvm和包管理工具npm(对应python的pip)
  2. 服务器是个进程,创建了一个服务器后它会一直监听一个端口,等待请求,在收到url请求后会根据服务器程序逻辑处理参数、路径等信息相应的返回请求的资源(本程序返回的是html或一些文件的显示或下载)服务器是个进程,创建了一个服务器后它会一直监听一个端口,等待请求,在收到url请求后会根据服务器程序逻辑处理参数、路径等信息相应的返回请求的资源(本程序返回的是html或一些文件的显示或下载)
  3. 异步可以理解为事件触发,同步则是顺序执行
  4. JavaScript导模块的形式和python的import…as很类似,都会给模块取名
  5. 理解服务当前所在地址、路径名和绝对路径的区别
  6. 注意解析客服端请求的url并将其转换成资源管理器上的路径时要先对url进行解码
  7. 体会到了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静态资源服务器的搭建----访问本地文件夹(搭建可访问静态文件的服务器)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值