• 二十、Node.js- WEB 服务器 (三)静态文件托管、 路 由


    1、Nodejs 静态文件托管

    上一讲的静态 web 服务器封装

    项目结构:

    Web服务器封装成的模块:router.js代码:

    var http=require('http');
    var fs=require('fs');
    var path=require('path');  /*nodejs自带的模块*/
    var url=require('url');
    //引入events模块解决无法获取异步数据问题
    var events=require("events");
    var  EventEmitter=new events.EventEmitter();
    module.exports = {
        statics: function (req, res,staticpath) {
            var pathname = url.parse(req.url).pathname;/*获取url传值*/
            if (pathname == '/') {
                pathname = '/index.html'; /*默认加载的首页*/
            }
            //获取文件的后缀名
            var extname = path.extname(pathname);
            if (pathname != '/favicon.ico') {  /*过滤请求favicon.ico*/
                //文件操作获取 static下面的文件
                fs.readFile(staticpath+'/' + pathname, function (err, data) {
                    if (err) {  /*么有这个文件*/
                        console.log('404');
                        fs.readFile(staticpath+'/404.html', function (error, data404) {
                            if (error) {
                                console.log(error);
                            }
                            res.writeHead(404, {"Content-Type": "text/html;charset='utf-8'"});
                            res.write(data404);
                            res.end(); /*结束响应*/
                        })
                    } else { /*返回这个文件*/
                        getMime(extname, EventEmitter)  /*获取文件类型*/
                        EventEmitter.on("msg", function (text) {
                            res.writeHead(200, {"Content-Type": "" + text + ";charset='utf-8'"});
                            //res.write(data);注意,在接收广播的回调函数里面不能使用write了,否则会报错:write after end
                            res.end(data); /*结束响应*/
                        })
                    }
                })
            }
        }
    }
    
    
    //获取文件类型的方法,  私有
    function getMime(etxName,EventEmitter) {
        fs.readFile("./mime.json",function (err,data) {
            if (err){
                console.log('mime.json文件不存在');
            }else {
                //console.log(data.toString());//将十六进制转换为字符串
                var  mimes=JSON.parse(data.toString());//将json字符串转换为json对象
                EventEmitter.emit("msg",mimes[etxName]||"text/html")//广播对应的头文件信息,如果没有的话就返回text/html
            }
        })
    }

    创建服务器的00service01.js的代码:

    var http=require('http');
    var fs=require('fs');
    var  router=require("./model/router")
    
    http.createServer(function (req,res) {//注意req,res不要写反
    
        router.statics(req,res,"static")
    
    }).listen(8002)

    2、路由

    官方解释:

    路由(Routing)是由一个 URI(或者叫路径)和一个特定的 HTTP 方法的,涉及到应用如何响应客户端对某个网站节点的访问。

    非官方解释:

    路由指的就是针对不同请求的 URL,处理不同的业务逻辑。

     路由代码参考:

    var http = require("http")
    var url = require("url")
    http.createServer(function (req, res) {
        var allUrl = req.url;
        var path = url.parse(allUrl).pathname;
        if (path == "/login") {
            res.end("login")
        } else if (path == "/register") {
            res.end("register")
        } else if (path == "/admin") {
            res.end("admin")
        }
    })
  • 相关阅读:
    BZOJ2286 [Sdoi2011]消耗战 【虚树 + 树形Dp】
    BZOJ1305 [CQOI2009]dance跳舞 【网络流】
    BZOJ1452 [JSOI2009]Count 【树套树 (树状数组)】
    BZOJ1103 [POI2007]大都市meg 【树剖】
    BZOJ1927 [Sdoi2010]星际竞速 【费用流】
    POJ3450 Corporate Identity 【后缀数组】
    POJ3623 Best Cow Line, Gold 【后缀数组】
    POJ3415 Common Substrings 【后缀数组 + 单调栈】
    关于线上bug
    关于线上bug
  • 原文地址:https://www.cnblogs.com/luzhanshi/p/10768920.html
Copyright © 2020-2023  润新知