web前端技术栈

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

2018-06-12  本文已影响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);

上一篇 下一篇

猜你喜欢

热点阅读