深入理解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);
网友评论