在学之前我们先了解一下什么是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=26中name=egg&age=26就是用户传递过来的参数。我们可以通过context.query(为一个对象)拿到解析过后的这个参数体
1模块。出口 = 应用 => { 2 3类 HomeController 扩展了 控制器 { 4 async getQuery () { 5const queryObj =this 。ctx 。查询; 6 控制台。日志(queryObj 。年龄); 7 控制台。日志(queryObj ); 8//打印结果:{name:'egg',age: 9'26 '} } 10 } 11return SearchController ; 12} ;
当Query String中的键重复时,ctx.query只取key首次出现时的值,后面再出现的都会被忽略。GET /posts?category=egg&category=koa通过ctx.query拿到的值是{category:'egg'}。
这样处理的原因是为了保持统一性,由于通常情况下我们都不会设计让用户传递key相同的查询字符串,所以我们经常会写类似下面的代码:
1const key = ctx 。查询。关键 || '' ; 2如果 (关键。startsWith ('蛋' )) { 3//做一些事情4}
而如果有人有人主动发起请求在查询字符串中带上重复的key来请求时就会引发系统异常。因此框架保证了从ctx.query 上获取的参数一旦存在,一定是字符串类型。
查询
有时我们的系统会设计成让用户传递相同的键,例如GET /posts?category=egg&id=1&id=2&id=3。针对这种情况,框架提供了ctx.queries对象,这个对象也解析了Query String,但是它不会改变任何一个重复的数据,否则将他们都放到一个摘要中:
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获取到。
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}
网友评论