【融职培训】Web前端学习 第8章 egg基础教程3 控制器

2020-06-24 17:09:45 浏览数 (1)

在学之前我们先了解一下什么是Controller

简单的说Controller负责解析用户的输入,处理后返回相应的结果,如

  • 在RESTful接口中,控制器接受用户的参数,从数据库中查找内容返回给用户或将用户的请求更新到数据库中。
  • 在HTML页面请求中,Controller根据用户访问不同的URL,渲染不同的模板得到HTML返回给用户。
  • 在代理服务器中,控制器将用户的请求转发到其他服务器上,变为其他服务器的处理结果返回给用户。

一,创造控制器

app/controller/是创建Controller的文件夹,或者我要合并一个首页或是基础页面的HomeController

创建HomeController首先约会app.Controller和导出HomeController

如果熟悉koa2的语法,使用ctx某些则非常方便,渲染模板await this.ctx.render('home/index')直接即可。

二,请求与响应

框架通过在Controller上绑定的Context实例,提供了许多便捷方法和属性获取用户通过HTTP请求发送过来的参数。

询问

在URL中?后面的部分是一个 Query String,该部分经常用于GET类型的请求中传递参数。例如GET /search?name=egg&age=26name=egg&age=26就是用户传递过来的参数。我们可以通过context.query(为一个对象)拿到解析过后的这个参数体

代码语言:javascript复制
 1 模块。出口 =  应用 =>  {
 2  
 3 类 HomeController  扩展了 控制器 { 
 4   async  getQuery () { 
 5       const  queryObj  =  this 。ctx 。查询; 
 6       控制台。日志(queryObj 。年龄); 
 7       控制台。日志(queryObj ); 
 8       //打印结果:{name:'egg',age:
 9     '26 '} } 
10   } 
11   return  SearchController ; 
12 } ;

当Query String中的键重复时,ctx.query只取key首次出现时的值,后面再出现的都会被忽略。GET /posts? category=egg&category=koa通过ctx.query拿到的值是{category:'egg'}。

这样处理的原因是为了保持统一性,由于通常情况下我们都不会设计让用户传递key相同的查询字符串,所以我们经常会写类似下面的代码:

代码语言:javascript复制
1 const  key  =  ctx 。查询。关键 ||  '' ; 
2 如果 (关键。startsWith ('蛋' )) { 
3   //做一些事情
4 }

而如果有人有人主动发起请求在查询字符串中带上重复的key来请求时就会引发系统异常。因此框架保证了从ctx.query 上获取的参数一旦存在,一定是字符串类型。

查询

有时我们的系统会设计成让用户传递相同的键,例如GET /posts?category=egg&id=1&id=2&id=3。针对这种情况,框架提供了ctx.queries对象,这个对象也解析了Query String,但是它不会改变任何一个重复的数据,否则将他们都放到一个摘要中:

代码语言:javascript复制
 1 // GET / posts?category = egg&id = 1&id = 2&id = 3 
 2 类 PostController  扩展了 控制器 { 
 3   异步 listPosts () { 
 4     控制台。日志(此。CTX 。查询); 
 5     // { 
 6     //类别:['egg'],
 7     // id:['1','2','3'],
 8     //} 
 9   } 
10 }

ctx.queries 上所有的key如果有值,也一定会是层叠类型。

三,获取请求参数

路由器参数

在Router中,我们介绍了Router上也可以申明参数,这些参数都可以通过ctx.params获取到。

代码语言:javascript复制
1 // app.get('/ projects /:projectId / app /:appId','app.listApp'); 
2 // GET / projects / 1 / app / 2 
3 类 AppController  扩展了 控制器 { 
4   异步 listApp () { 
5     断言。等于(此。CTX 。PARAMS 。专案编号, '1' ); 
6     断言。等于(此。CTX 。PARAMS 。APPID , '2' ); 
7   } 
8 }

0 人点赞