• 如何创建一个基于Node的HTTP服务器


    首先创建一个HTTP服务器。

    var http = require('http');
    
    function serve(request,response) {
        console.log(request.method);    //请求的方法
        console.log(request.url);  //请求里的url,只含有路径名,并不是完整的url
        console.log(request.header) //获取请求头
    
        response.statusCode = 200;  
        //设置响应类型,编码为utf-8。
        //服务器返回资源给浏览器时,还应该告诉浏览器这是什么类型的文件,以什么方式解析。不指定的话可能会造成乱码
        response.setHeader('Content-Type','text/html;charset=utf-8');
        response.setHeader('name','zfpx');
        response.write(new Date().toString());
        response.end();
    }
    
    var server = http.createServer(serve);
    server.listen(3000);

    如果我们希望读取其他文件的内容,则需要先导入fs模块,该模块是读取文件的模块

    var fs = require('fs');
    function
    serve(request,response) { var url = request.url;//设置响应类型,编码为utf-8。 //服务器返回资源给浏览器时,还应该告诉浏览器这是什么类型的文件,以什么方式解析 response.setHeader('Content-Type','text/html;charset=utf-8'); //如果我们希望返回的是其他文件的内容,则需要先读取其他文件,这时需要fs模块来读取文件 fs.readFile('index.html',function(err,data) { response.write(data); response.end(); }) }

    但是这样又有一个问题,就是:在对返回的HTML代码开始解析时,解析过程中如果遇到引用的服务器上的资源(额外的CSS,JS代码,图片等资源),需要再次向服务器发送请求,但是不管是发送什么请求,服务器返回的都是index.html文件。这时,我们就需要对不同的请求资源做一个判断,让其返回不同类型的资源。

    function serve(request,response) {
        var url = request.url;
        if (url == '/') {
            //设置响应类型,编码为utf-8。
            //服务器返回资源给浏览器时,还应该告诉浏览器这是什么类型的文件,以什么方式解析
            response.setHeader('Content-Type','text/html;charset=utf-8');
            //如果我们希望返回的是其他文件的内容,则需要先读取其他文件,这时需要fs模块来读取文件
            fs.readFile('index.html',function(err,data) {
                response.write(data);
                response.end();
            })
        }else if (url == '/style.css') {
            response.setHeader('Content-Type','text/css;charset=utf-8');
            //如果我们希望返回的是其他文件的内容,则需要先读取其他文件,这时需要fs模块来读取文件
            fs.readFile('style.css',function(err,data) {
                response.write(data);
                response.end();
            })
        }

    一个页面里,我们可能会请求非常多的静态资源,如果每次都加一个else if 显然让页面更复杂,且不利于维护。所以我们希望将所有的静态资源请求都封装在一个函数里。

    function parseMime(pathname) {
        var reg = /.(HTML|JS|CSS|JSON|TXT|ICO|JPG)/i;
        if (reg.test(pathname)) {
            //获取请求文件的后缀名
            var suffix = reg.exec(pathname)[1].toUpperCase();
            //根据请求文件的后缀名获取到当前文件的MIME类型
            var suffixMIME = "text/plain";
            switch(suffix) {
                case "HTML":
                    suffixMIME = "text/html";
                    break;
                case "CSS":
                    suffixMIME = "text/css";
                    break;
                case "JS":
                    suffixMIME = "text/javascript";
                    break;
                case "JSON":
                    suffixMIME = "application/json";
                    break;
                case "ICO":
                    suffixMIME = "application/octet-stream";
                    break;
                case "JPG":
                    suffixMIME = "image/jpg";
                    break;
                
            }
        }
        return suffixMIME;
    }

    实际上,Node中还提供了一个第三方的模块能够自动帮我们判断文件的MIME类型,我们这里还需要用到一个第三方的模块"mine"。

    var mime = require('mime');
    
    function serve(request,response) {
        var url = request.url;
        if (url == '/') {
            //设置响应类型,编码为utf-8。
            //服务器返回资源给浏览器时,还应该告诉浏览器这是什么类型的文件,以什么方式解析
            response.setHeader('Content-Type','text/html;charset=utf-8');
            //如果我们希望返回的是其他文件的内容,则需要先读取其他文件,这时需要fs模块来读取文件
            fs.readFile('index.html',function(err,data) {
                response.write(data);
                response.end();
            })
        }else{
            static(url,response)
        }    
    }
    
    function static(url,response) {
        response.setHeader('Content-Type',mime.lookup(url) + ';charset=utf-8');
        //如果我们希望返回的是其他文件的内容,则需要先读取其他文件,这时需要fs模块来读取文件
        fs.readFile(url.slice(1),function(err,data) {
            response.write(data);
            response.end();
        })
        
    }

     现在我们的url都是类似http://localhost:3000/index.html这样的,就是客户端只是单纯的获取数据,并不涉及向服务器端发送数据。

    前面我们说过,request.url获取的是'3000:'之后的内容,那么当我们需要向服务器传一些内容的时候,比如说http://localhost:3000/index.html/?name="xiaoyu"。这时request.url获取的就是/index.html/?name="xiaoyu"。

    这样的url显然不能再作为我们判断路径的依据,所以我们得进一步处理这个url。其实node提供了一个更加强大的url解析库给我们,这个库就是”url“。这个库能够解析整个完整的url路径。

    传送地址:url模块学习小结

  • 相关阅读:
    块数据加密模式
    "jobTracker is not yet running"(hadoop 配置)
    平衡搜索树
    Programming Assignment 3: Collinear Points
    Programming Assignment 2: Randomized Queues and Deques
    Programming Assignment 1: Percolation
    1007. Maximum Subsequence Sum (25)
    Link List
    1081. Rational Sum (20)
    strassen algorithm
  • 原文地址:https://www.cnblogs.com/yuliangbin/p/9429062.html
Copyright © 2020-2023  润新知