Egg.js 学习笔记01
Posted Deflect-o-Bot Blog
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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"
以上是关于Egg.js 学习笔记01的主要内容,如果未能解决你的问题,请参考以下文章
egg.js + react 实战:从 0 到 1 实现记账本小册学习笔记合集(持续更新中)
egg.js + react + zarm ui + vite2.0 全栈项目实战:从 0 到 1 实现记账本小册学习笔记合集(完结)