Egg.js 学习笔记01
Controller概念:解析用户输入,处理并返回响应的结果;
框架中,Controller层主要是对用户的请求的参数进行处理(校验、转换),然后调用 service 方法处理业务:
- 获取用户通过HTTP传递过来的请求参数
- 校验,组装参数
- 调用Service进行业务处理,必要时转换Service返回的结果以适应客户端需求
- 通过HTTP将结果响应给客户端
一个简单的Controller如下:(返回body内容而已)
const {Controller} = require('egg') class IndexController extends Controller { async index() { const {ctx} = this ctx.body = 'hi, eggJs' } } module.exports = IndexController
一个稍微复杂一点的Controller 如下 目录位置:app/controller/post.js
const { Controller } = require('egg'); class PostController extends Controller { async create() { const { ctx, service } = this; const createRule = { title: { type: 'string' }, content: { type: 'string' }, }; // 校验参数 ctx.validate(createRule); // 组装参数 const author = ctx.session.userId; const req = Object.assign(ctx.request.body, { author }); // 调用 Service 进行业务处理 const res = await service.post.create(req); ctx.body = { id: res.id }; ctx.status = 201; } } module.exports = PostController;
注意上面这个demo是不能直接运行的,ctx下的属性和方法我们并没有创建,怎么解决呢?
因为Controller继承自egg.Controller,会有几个属性挂在this上分别是:
this.ctx, this.app, this.service, this.config, this.logger
其中 this.ctx,即请求的上下文Context,在这里就可以封装我们的属性和方法,也就是上面demo的解决方式
目录位置:app/extend/context.js
module.exports = { validate(param) { // 校验参数的方法 console.log('参数是:', param); }, };
Query参数
Controller是业务开发中唯一和http协议打交道的地方,所以难免遇到参数获取的问题,这里获取方式和Koa类似:
在URL中?后面的部分是一个 Query String,在get请求中传递参数。如:/post?id=12&username=green,我们可以通过ctx.query拿到解析过后的参数
URL: http://127.0.0.1:7002/post?id=12&name=green
class PostController extends Controller { async listPost() { const query = this.ctx.query //{id:"12",name:"green"} } }
注意:当客户端传递的key有重复的情况下,ctx.query只取第一次出现的值,后面重复key的值均忽略
如果设计成客户端传递相同的key,如 http://127.0.0.1:7002/post?id=12&name=green&id=13&name=king,可以使用ctx.queries获取参数,参数将以数组的形式作为值存在对应的键下
{id:["12","13"],name:["green","king"]}
Params参数
在路由上,如果申明的参数,可以通过ctx.params获取
URL: http://127.0.0.1:7002/188/post?id=12&name=green&id=13&name=king 路由 router.get('/:testId/post', controller.post.create); class postController extends Controller { async listApp() { console.log(this.ctx.params.testId,); // {testId: "188"} } }
posted on 2023-03-14 16:38 Deflect-o-Bot 阅读(62) 评论(0) 编辑 收藏 举报