最新要闻

广告

手机

iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?

iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?

警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案

警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案

家电

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=greenclass 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"}  }}

关键词: