node.js第十四课(路由控制)
一、工作原理
当通过浏览器访问app.js建立的服务器时,会看到一个简单的页面,实际上它已经完成了许多透明的工作,
当访问http://localhost:3000,浏览器会向服务器发送请求,包括请求的方法、路径、HTTP协议版本和请求头信息。app会解析请求的路径,调用相应的逻辑,app.js中有app.get("/",routes.index)通过res.render("index",{title:"pcat"})调用视图模版index,传递title变量,最终视图生成HTML页面,返回给浏览器。
浏览器接收到内容后,通过分析需要获取/stylesheets/style.css,因此会再次向服务器发起请求,app.js并没有一个路由规则指派到/stylessheets/style.css,但app通过app.use(express.static(__dirname+'/public'))配置了静态文件服务器,因此会定向到app.js所在目录下的/public/stylessheets/style.css拿去这个文件。
这是一个典型的MVC架构,浏览器发送请求,由路由控制接受,根据不同的路径定向到不同的服务器,控制器处理用户具体的请求,可能会访问数据库中的对象,即模型部分,生成视图的HTML,最后再由控制器返回给浏览器,完成一次请求。
二、创建路由规则
当我们在浏览器访问http://localhost:3000/octopus的时候,服务器响应头返回HTTP 404错误
这是因为/octopus是一个不存在的路由规则,而且它也不是一个public目录下的文件,所以响应404
假设我们创建一个/octopus的路由规则。
app.get('/octopus',function(req,res){
res.send('这是 octopus 的路径');
}); //若我们定义“/octopus的路由规则”两次,则按照先定义的路由规则走。
app.get("/octopus",routes.octopus); //在index.js中增加函数octopus
exports.octopus=function(req,res){
res.send('The time is '+new Date().toString());
}
服务器在开始监听之前,设置好了所有的路由规则,当请求到达时直接分配到相应函数。app.get是路由规则创建函数,
参数一:请求的路径
参数二:是一个回调函数,该路由规则被触发时调用回调函数,并传递req(请求信息)和res(响应信息)两个参数。
三、路径匹配
上面讲到了为固定的路径设置路由规则,Express还提供更高级的路径匹配模式。
1.app.get('/user/:username',function(req,res){
res.send("user :"+req.params.username);
});
路径规则/user/:username会被自动编译成正则表达式,类似于\/user\/([^\/]+)\/?这样的形式,路径参数可以相应函数中通过req.params的属性访问
2.路径规则同样支持javascript正则表达式,例如:app.get(\/user\/([^\/]+)\/?,callback),这样的好处在于可以定义更加复杂的路径规则,不同支持是配置的参数是匿名的,因此需要通过req.params[0]这样的形式访问。
四、R