继续浏览精彩内容
慕课网APP
程序员的梦工厂
打开
继续
感谢您的支持,我会继续努力的
赞赏金额会直接到老师账户
将二维码发送给自己后长按识别
微信支付
支付宝支付

《Node.js开发指南》microblog手动代码二

startitunderground
关注TA
已关注
手记 58
粉丝 99
获赞 931

上一节描述了怎么构建这个工程的基本架构,这节讲述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()转移控制权,又被第二条规则捕获,向浏览器返回了信息。这是一个非常有用的工具,可以让我们轻易地实现中间件,还可以提高代码的复用度;

打开App,阅读手记
5人推荐
发表评论
随时随地看视频慕课网APP

热门评论

express 可以匹配更高级的路由 

     如要展示一个用户的个人页面路径为/user/[username];可以使用:

app.set("user/:username",function(req,res){
    res.send("user: " +req.params.username);
});


查看全部评论