学习总结之使用Node.js搭建一个类似于Apache的服务器

Node.js学习总结


Node.js不是一门语言,也不是库,不是框架,它是一个javascript运行时的环境

node.js的构成:
  • 没有Dom
  • 没有Bom
  • 只有ECMAScript
特性:
  • 事件驱动
  • 非阻塞IO模型,即异步
  • 轻量和高效:Node.js的解析引擎是Google Chrome中的v8引擎,目前是公认的解析javascript最快的
主要用途:
  • web服务器后台
  • 命令行工具,比如:npm,git,hexo等

搭建简单的服务器

首先需要加载http以及创建server服务器:
//1.加载http
var http = require('http')
//2.创建一个web服务器
var server = http.createServer()
接着,注册服务器的request请求事件,每当客户端请求过来,都会触发一次服务器的request事件,然后执行回调函数:
server.on('request', function (request, response) {
    var url = request.url
    if(request.url == '/') {
        response.write('index')
    }else if(request.url == '/login') {
        response.write('login,你好啊')
    }else if(request.url == '/register'){
        response.write('register')
    }else if(request.url == '/items'){
        response.write(JSON.stringify(items))   //只支持2进制和字符串
    }else if(request.url == '/html') {
        response.setHeader("Content-Type","text/html;charset=utf-8")

        //text-plain 普通文本
        //text-html  以html格式解析文本
        response.write('<p>hello html<a href="#">你好</a></p>')
    }
    else{
        response.write('抱歉,你访问的页面不存在')
    }
    response.end()
})
服务器运行,还需要listen函数监听,端口号随便设置,只要不被占用就可以
server.listen(3000,function () {  
    console.log('server is running...')
})

这里写图片描述
现在,我们命令行输入 node http.js即可开启服务器,打开浏览器,输入网址,就会展示上面的内容

目前只能实现在页面输出自己输入的内容,想要读取html文件,还需要结合fs,发送文件中的数据,具体如下:
var fs = require('fs')
接下来,新建几个文件夹以及html文件,txt文件,img图片等等用来测试,代码如下:
var url = request.url     //url统一资源定位符
if(url === '/') {
        //读文件
        fs.readFile('./resource/inde.html', function (err,data) {
            if(err) {
                response.setHeader("Content-Type","text/html;charset=utf-8")
                response.end('<h1>页面加载失败,请稍后重试!</h1>')
            } else {
                response.setHeader("Content-Type","text/html;charset=utf-8")
            //    data默认是二进制数据,可以转为字符串格式
                response.end(data)    //支持二进制和字符串,所以不用转
            }
        })
    } else if(url === '/img') {
        fs.readFile('./resource/img.jpg', function (err,data) {
            if(err) {
                response.setHeader("Content-Type","text/html;charset=utf-8")
                response.end('<h1>页面加载失败,请稍后重试!</h1>')
            } else {
                response.setHeader("Content-Type","image/jpeg")
                //    data默认是二进制数据,可以转为字符串格式
                response.end(data)    //支持二进制和字符串,所以不用转
            }
        })
    }
在这里,request.url==='/'即是主页,输入正确的路劲即会显示出来,错误的则显示  页面加载失败,请稍后重试
现在已经能基本访问文件了,但是,写的内容是死的,也就是说这个服务器只能响应我们规定的那几个文件,当添加新的文件的时候就不管用了,应该创建动态读取文件的方法,方法很简单,稍微改变一下就好了:
var wwwUrl = 'F:/www'

    // response.setHeader("Content-Type", "text/html;charset=utf-8")

    if (url === '/') {
        url = '/index.html'
    }


    fs.readFile(wwwUrl + url, function (err, data) {
        if (err) {
            fs.readFile(wwwUrl + '/404.html', function (err, data) {
                response.end(data)
            })
            return
        }
        response.end(data)
    })
我们规定一个最外层文件夹地址,在哪里不重要,当它改变位置时,只要改wwwUrl就可以,如上面这般,url是根据我们在地址栏输入的内容而动态变化的,相应的fs读取文件的路径也在动态改变。接下来,当我们有新增文件,也能够进行访问。

最后,可以看到,上面的代码有这么一句:

response.setHeader("Content-Type", "text/html;charset=utf-8")

这是告诉浏览器,发送的内容是什么数据类型,有html,纯文本,图片等等特别多,推荐一个网站HTTP Content-Type对照表,里面有上百种格式。

现在,类似Apache的基本功能差不多就实现了,但是还不完美,因为我们必须手动在地址栏输入地址才可以访问,这显然不是我们想要的,你不能要求用户在地址栏输入,所以需要把地址以链接的形式渲染在页面当中,后续我再总结…

猜你喜欢

转载自blog.csdn.net/weixin_41678746/article/details/81627332