Node Web学习笔记(8)-路由转发

通过前面的学习,已经能够出现一个网站的基本雏形了,通过URL的访问路径不同,返回不同的页面,这块的功能我们是写在了Server.js文件中了,其实这块应该路由功能,应该由路由模块来完成。

今天学习的内容就是将路由功能模块单独出来。首先要清楚路由的基本功能是什么,路由就是给你『指路』,通过你访问的URL帮你找到你要的服务器资源。这应该是路由的功能。那么,我们在编写服务器的时候,就是解析URL的路径,返回客户端想要的资源。

第一步还是写服务器的代码server.js;如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
//server.js
var http = require('http');
var querystring = require('querystring');
var url = require('url');
var router = require("./router");
var server = http.createServer(function(req,res){
var pathname = url.parse(req.url).pathname;
console.log(pathname);
var pageContent = router.router(pathname); //将访问路径作为参数传递给路由器
console.log(pageContent);
res.writeHead(200, {"Content-Type":"text/html"});
res.write(pageContent);
res.end();
});
server.listen(8888);
console.log("Your Server is started @port 8888");

这段代码可以看出来,我们把之前判断路径的那部分代码移走了,而是引入了一个router模块,将pathname传递给router函数,这样就简要实现了将路由模块分离的功能,下面看看router模块代码。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
//router.js
var fs = require('fs');
function router(pathname){
if(pathname == "/Node01"){
fs.readFile("Node_Web_01.html", "utf8",function(err,data){
if(err){
console.log("Error:" + err);
}else{
return data;
}
});
}else if(pathname == "/Node02"){
return "<h1>Welcome to My second Page";
}else if(pathname == "/Node03"){
return "<h1>Welcome to My third Page";
}else{
return "<h1>404 NOT FOUND</h1>";
}
}
exports.router = router;

同样是很简单的一段代码,路由的功能就是判断路径进行转发,最后将router模块对象输出。运行server.js文件,访问相应的网址就会得到相应的返回内容。

如果你实际运行了一下这个代码,你会发现,在输入http://localhost:8888/Node01的时候,系统会报错退出,你可以debug一下,很快就会发现问题所在。

原因就在你在访问Node01路径的时候,下面有个readFile的异步操作,也就是说主程序还没有读完文件return data,服务器就已经返回客户端了,那么PageContent就会报错为undefined.

如果将上面读取文件的代码改为:

1
return fs.readFileSync("Node_Web_01.html", "utf8");

这样就会正常返回html页面了。