Egg.js 学习笔记01

Controller概念:解析用户输入,处理并返回响应的结果;

框架中,Controller层主要是对用户的请求的参数进行处理(校验、转换),然后调用 service 方法处理业务:

  1. 获取用户通过HTTP传递过来的请求参数
  2. 校验,组装参数
  3. 调用Service进行业务处理,必要时转换Service返回的结果以适应客户端需求
  4. 通过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  阅读(51)  评论(0编辑  收藏  举报