所谓路由就是web服务器会根据用户输入的不同url(实际是path不同, domain是相同的, 包括协议, host, port)返回不同的页面。例如登录页面login和注册页面register
#默认端口为80
http://localhost/login #login页面
http://localhost/register #register页面
实现思路
1.第一步要得到用户请求的url
可以通过监听函数中的request参数获取, 即request.url
2.解析url,得到具体的请求页面, 也就是路由入, login 和register
获取url之后,利用标准模块‘url’中的parse 函数提取出路由
首先看一下url.parse( )函数的功能, 例如调用url.parse(http://localhost/login)的结果如下所示
Url {
protocol: 'http:',
slashes: true,
auth: null,
host: 'localhost',
port: null,
hostname: 'localhost',
hash: null,
search: null,
query: null,
pathname: '/login',
path: '/login',
href: 'http://localhost/login' }
获得的是一个url对象, 可以提取出各部分的内容, 所以路由信息可以提取为
var pathname = url.parse(request.url).pathname;
但是我们还需要将‘/’去掉
pathname = pathname.replace(/\//,'')//去掉 '/'
3.编写路由器, 路由器就是若干个返回不同页面的函数集合, 路由器根据不同的路由信息调用不同的函数, 返回不同的页面。
//------------router.js-------------------------
module.exports = {
login:function(req, res) {
res.writeHead(200,{'Content-type':'text/html,charset=utf-8'})
res.write('Login page')
res.end()
},
register:function(req, res) {
res.writeHead(200,{'Content-type':'text/html,charset=utf-8'})
res.write('Register page')
res.end()
}
}
主函数入下, 则可实现根据不同的路由(pathname)调用不同的路由函数, 返回不同的页面。
//------------main.js---------------------
var http = require('http');
var functions=require('./models/functions.js')
var router=require('./router')
var url = require('url')
http.createServer(function(request, response) {
var pathname = url.parse(request.url).pathname;
pathname = pathname.replace(/\//,'')//去掉 '/'
console.log(pathname)
router[pathname](request, response)
}).listen(80);
console.log('Server is running at 127.0.1.1:80')
就咱们的这个例子来说只在router里面定义了连个函数login 和register, 如果用户请求其他的页面,web 服务会直接崩溃,这不是我们希望看到的, 所以要提供例外来处理用户的其他我们没有定义的请求页面。 实现很简答, 只是将router[pathname](request, response)
包进try…catch块中, 在catch中对异常进行妥善处理
try {
router[pathname](request, response)
}catch(err) {
response.writeHead(200,{'Content-Type':'text/html,charset=utf-8'});
response.write(err.toString())
response.end()
}
这样即使用户输入千奇百怪的url, web服务也不会崩溃, 只会在前端显示错误信息提示用户。