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 阅读(94) 评论(0) 收藏 举报
Egg.js 为企业级框架和应用而生
浙公网安备 33010602011771号