上一节描述了怎么构建这个工程的基本架构,这节讲述Express的基本使用方法,完善这个工程的功能;
路由控制一,工作原理
当通过浏览器访问app.js建立的服务器时,会看到一个简单的页面,实际上它已经完成了许多透明的工作,了解它的工作机制帮助理解网站的整体架构是:访问http://localhost:3000,浏览器会向服务器发送请求:
app会解析请求的路径,调用相应的逻辑,app.js中有一行内容是app.use("/",index),它的作用是规定路径为“/”的GET请求由index处理,index通过routes/index.js中的res.render("index",{title:"MGT360124"}),调用视图模板index,传递title变量。最后视图模板生成HTML页面,返回给浏览器,返回的内容是:
浏览器在接收到内容以后,经过分析发现要获取/stylesheets/style.css,再次向服务器发送请求,app.js中并没有一个规则指派到/stylesheets/style.css,但是app通过app.use(express.static(path.join(__dirname, 'public')));配置了静态文件服务器,所以/stylesheets/style.css会定向到app.js所在目录的子目录的文件public/stylesheets/style.css,向客户端返回:
由Express创建的网站架构如图:
这是一个典型的MVC架构:浏览器发起请求,由路由控制器接收,根据不同路径定向到不同的控制器,控制器处理用户的具体请求,可能会访问数据库中的对象,即模型部分,控制器还要访问模板引擎,生成视图HTML,最后再由控制器返回给浏览器,完成一次请求。
二,创建路由规则
例如当在浏览器中访问http://localhost:3000/abc这样不存在的页面时,服务器会在响应头返回404 not found 错误:
因为/abc是一个 不存在的路由规则,而且它页不是public目录下的静态文件,所以Express返回404 not found的错误。
那么接下来怎么创建路由规则
假设现在要创建一个地址为/hello.html的页面,内同时当前的服务器时间,做法是:
//打开app.js,在已有的路由规则app.use("/",index),后添加一行app.use("/hello.html",index);
app.use("/",index);
app.use("/hello.html",index);
然后在routes/index.js中增加:
router.get("/hello.html",function(req,res,next) {
res.send("<h2>MGT360124成功创建一个/hello.html页面</h2>" +“This time is ” + new Date().toString() );
});
重启app.js,在浏览器中地址栏输入http://localhost:3000/hello.html,刷新页面会更新时间,因为这是由服务器动态创建的页面,如图:
服务器在开始监听之前,设置好了所有路由规则,
三,REST风格的路由规则
Express支持REST风格的请求方式,REST的意思是:表征状态转移(Representational State Transfer),它是基于HTTP协议网络应用的接口风格,充分利用HTTP的方法实现统一风格接口的服务;
GET :获取,POST:新增,PUT:更新,DELETE,删除
express对每种HTTP请求方法都设计了不同的路由绑定函数,
请求方式 绑定函数
GET app.get(path,callback)
POST app.post(path,callback)
DELETE app.delete(path,callback)
PUT app.put(path,callback)
PATCH app.patch(path,callback)
TRACE app.trace(path,callback)
CONNECT app.connect(path,callback)
options app.options(path,callback)
所有方法 app.all(path,callback)
例如要绑定某个路径的POST请求,则可以用app.post(path,callback)的方法
四,控制权转移
Express支持同一路径绑定多个路由响应函数:
app.all("/user/:username",function(req,res){
console.log("all methods captured " );
})
app.set("/user/:username",function(req,res){
res.send("user: " +req.params.username);
})
访问任何这两条同样的规则匹配到的路径时,会发现请求总是会被前一条路由规则捕获,后面的规则会被忽略,Express提供了路由控制权转移的方法,即回调函数的第三个参数next,通过调用next(),会将路由控制权转移给后面的规则,例如:
app.all("/user/:username",function(req,res){
console.log("all methods captured " );
next();
})
app.set("/user/:username",function(req,res){
res.send("user: " +req.params.username);
})
当访问被匹配到路径时,如http://localhost:3000/user/mgt,会发现浏览器运行环境打印了 all methods captured,而且浏览器中显示了user:mgt,说明请求先被第一条规则捕获,之后使用了next()转移控制权,又被第二条规则捕获,向浏览器返回了信息。这是一个非常有用的工具,可以让我们轻易地实现中间件,还可以提高代码的复用度;
热门评论
express 可以匹配更高级的路由
如要展示一个用户的个人页面,路径为/user/[username];可以使用: