美文网首页web前端技术栈
爱前端邵山欢node.js篇-03深入理解NodeJS的服务器模

爱前端邵山欢node.js篇-03深入理解NodeJS的服务器模

作者: 大前端圈子 | 来源:发表于2018-06-12 19:47 被阅读65次

    深入理解NodeJS的服务器模式

    3.1看!它没有根目录!nodejs有着新的路由形式!

    我们先从Apache开始说。Apache为什么好用,因为它自动路由。所有的文件夹的层次,就是URL的层次。

    比如HTTP网址(网址我们叫做URL,也叫作路由):

    http://www.iqianduan.cn/regist/index.html

    它就表示服务器上有一regist文件夹,有一个index.html文件

    Ryne Dahl创始人,鬼才般的想到了一个点子,不用文件夹的层次表示路由(URL)。而是使用if语句。

    我们书写04.js:

    var http = require("http");

    var server = http.createServer(function(req,res){

    //路由

        if(req.url == "/a"){

    //设置HTTP响应头,设置字符集

            res.setHeader('Content-Type', 'text/html;charset=UTF8');

    res.end("

    我是新闻频道

    ");

        }else if(req.url == "/b"){

    //设置HTTP响应头,设置字符集

            res.setHeader('Content-Type', 'text/html;charset=UTF8');

    res.end("

    我是音乐频道

    ");

        }else{

    //设置HTTP响应头,设置字符集

            res.setHeader('Content-Type', 'text/html;charset=UTF8');

    res.end("

    没有这个页面

    ");

        }

    });

    server.listen(3000);

    我们的req对象表示请求,用户的请求的url属性就是用户请求的地址。我们用if语句进行判断,看看是用户输入的是哪个if语句,从而res.end()不同的内容。

    我们现在可以看一下,更高级的路由:

    补充正则表达式的知识:

    3.2使用外部文件

    事先创建了一个文件夹public/haha.html文件。

    我们书写06.js案例:

    var http = require("http");

    //file system, 文件系统模块

    var fs = require("fs");

    var serser = http.createServer(function(req,res){

        if(req.url == "/xixi"){

    //fs.readFile()表示读取一个文件

            fs.readFile("./public/haha.html", function (err, content) {

    //文件的内容是content参数,而err表示如果发生错误的错误信息

                res.end(content);

            });

        }else{

            res.end("no page");

        }

    });

    serser.listen(3000);

    fs是我们学习的第二个内置模块(http是第一个),具体什么是模块我们明天介绍。

    fs.readFile()表示读取某一个文件,这个函数是异步的,所有要有回调函数。具体什么是回调函数,明天上午介绍。

    对于一个文件有两个位置:

    1)物理文件的位置

    2)被路由的URL

    比如css.css可以被路由为/ysb; wangjunkai.png可以被路由到/yiyangqianxi去。

    今天06.js,花式路由,将haha.html路由到/xixi了;将css.css路由到/ysb了;将wangjunkai.png路由到了/yiyangqianxi了。

    var http = require("http");

    //file system, 文件系统模块

    var fs = require("fs");

    var serser = http.createServer(function(req,res){

        if(req.url == "/xixi"){

    //fs.readFile()表示读取一个文件

            fs.readFile("./public/haha.html", function (err, content) {

    //文件的内容是content参数,而err表示如果发生错误的错误信息

                res.end(content);

            });

        }else if(req.url == "/ysb"){

            fs.readFile("./public/css.css", function (err, content) {

    //文件的内容是content参数,而err表示如果发生错误的错误信息

                res.end(content);

            });

        }else if(req.url == "/yiyangqianxi"){

            fs.readFile("./public/wangjunkai.png", function (err, content) {

    //文件的内容是content参数,而err表示如果发生错误的错误信息

                res.end(content);

            });

        }else{

            res.end("no page");

        }

    });

    serser.listen(3000);

    看一下知乎的路由:

    https://www.zhihu.com/roundtable/feixingyuan

    https://www.zhihu.com/roundtable/zhuoyou

    https://www.zhihu.com/roundtable/canzhang

    https://www.zhihu.com/people/hao-xiao-sai/answers

    https://www.zhihu.com/people/hao-xiao-sai/answers

    https://www.zhihu.com/people/hao-xiao-sai/posts

    https://www.zhihu.com/people/hao-xiao-sai/columns

    https://www.zhihu.com/people/hao-xiao-sai/pins

    可不要认为人家的服务器上有一个文件夹叫做roundtable,有一个文件夹叫做feixingyuan。

    也不要认为有一个文件夹叫做people,有一个文件夹叫做hao-xiao-sai。

    https://www.zhihu.com/people/shaoshanhuan/answers

    以前的路由(包括现在的新浪微博都很垃圾,没法和facebook):

    http://www.zhihu.com/showAnswers.php?id=shaoshanhuan

    我们在nodejs中实现这样的路由:

    var http = require("http");

    var server = http.createServer(function(req,res){

    //得到用户输入的网址

        var user_url = req.url;

    //验证路由是否匹配“/某某/某某”的形式

        if (!/^\/(.+)\/(.+)$/.test(user_url)){

           //如果不匹配,对不起,本网站没有这个地址

            res.setHeader('Content-Type', 'text/html;charset=UTF8');

    res.end("

    没有这个页面!

    ");

            return;

        }

    //将用户的网址拆分出来

        var regObj = user_url.match(/^\/(.+)\/(.+)$/);

    //得到第一个圆括号中捕获的东西

        var username = regObj[1];

    //得到第二个圆括号中捕获的东西

        var column = regObj[2];

    //字典

        var dictionary = {

    "music" : "喜欢的音乐",

    "pic" : "喜欢的图片",

    "book" : "喜欢的书"

        }

    //呈递页面

        res.setHeader('Content-Type', 'text/html;charset=UTF8');

        res.end("

    " + username + dictionary[column] + "

    ");

    });

    server.listen(3000);

    效果(注意图中的路由)形式:

    这样的路由的好处就是:不需要开辟过多的文件夹、并且不暴露技术细节

    05.js是今天的重点案例,今天必须要会!

    3.2使用外部文件

    事先创建了一个文件夹public/haha.html文件。

    我们书写06.js案例:

    var http = require("http");

    //file system, 文件系统模块

    var fs = require("fs");

    var serser = http.createServer(function(req,res){

        if(req.url == "/xixi"){

    //fs.readFile()表示读取一个文件

            fs.readFile("./public/haha.html", function (err, content) {

    //文件的内容是content参数,而err表示如果发生错误的错误信息

                res.end(content);

            });

        }else{

            res.end("no page");

        }

    });

    serser.listen(3000);

    fs是我们学习的第二个内置模块(http是第一个),具体什么是模块我们明天介绍。

    fs.readFile()表示读取某一个文件,这个函数是异步的,所有要有回调函数。具体什么是回调函数,明天上午介绍。

    对于一个文件有两个位置:

    1)物理文件的位置

    2)被路由的URL

    比如css.css可以被路由为/ysb; wangjunkai.png可以被路由到/yiyangqianxi去。

    今天06.js,花式路由,将haha.html路由到/xixi了;将css.css路由到/ysb了;将wangjunkai.png路由到了/yiyangqianxi了。

    var http = require("http");

    //file system, 文件系统模块

    var fs = require("fs");

    var serser = http.createServer(function(req,res){

        if(req.url == "/xixi"){

    //fs.readFile()表示读取一个文件

            fs.readFile("./public/haha.html", function (err, content) {

    //文件的内容是content参数,而err表示如果发生错误的错误信息

                res.end(content);

            });

        }else if(req.url == "/ysb"){

            fs.readFile("./public/css.css", function (err, content) {

    //文件的内容是content参数,而err表示如果发生错误的错误信息

                res.end(content);

            });

        }else if(req.url == "/yiyangqianxi"){

            fs.readFile("./public/wangjunkai.png", function (err, content) {

    //文件的内容是content参数,而err表示如果发生错误的错误信息

                res.end(content);

            });

        }else{

            res.end("no page");

        }

    });

    serser.listen(3000);

    相关文章

      网友评论

        本文标题:爱前端邵山欢node.js篇-03深入理解NodeJS的服务器模

        本文链接:https://www.haomeiwen.com/subject/ffbreftx.html