eggjs笔记

本文介绍了EggJS中的核心概念,包括Application对象、Context请求级别对象、Controller、Service、Helper以及配置和日志管理。Application是全局对象,Context封装了请求信息,Controller和Service可通过this.app访问Application。Config用于配置管理,Logger提供了不同级别的日志记录功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  • 内置对象

  1. Application: 全剧应用对象,一个应用中只会实例化一个,可以在上面挂在一些全局的方法和对象 -> 扩展 Application 对象 (感觉类似window?)

    1. 事件:在框架运行时,会在Application实例上触发一些事件,可监听事件做一些操作。应用开发一般在启动自定义脚本中进行监听,框架提供了统一的入口文件(app.js)进行启动过程自定义,这个文件只返回一个函数
      var Cache = require('js-cache');
      module.exports = app => {
          app.cache = new Cache();
      
          //server: 一个worker进程只会触发一次,在http服务完成启动后,会将http server通过此事件暴露给开发者
          app.once('server', server => {
              console.log(server);
          });
          //error: 运行时任何异常被onerror插件捕获后,都会触发error事件,
          //将错误对象和关联到上下文(如果有)暴露给开发者,可以进行自定义的日志上报等处理
          app.on('error', (err, ctx) => {
              console.log(err, ctx);
          })
      
          //应用收到请求和响应请求时,分别触发request和response事件,并将当前请求上下文暴露出来,可记录日志
          app.on('request', ctx => {
              console.log(ctx);
          })
          app.on('response', ctx => {
              console.log(ctx);
          });
      };

       

    2. 访问方式

       

      1. 在context对象上可通过ctx.app获得
      2. Controller, Middleware, Helper, Service中都可以通过this.app访问到Application对象,如this.app.config访问配置对象
      3. 在app.js中Application对象会作为第一个参数注入到入口函数中module.exports = app => { //app.xxx }
  2. Context:是一个请求级别的对象。在每一次收到用户请求时,框架会实例化一个Context对象,这个对象封装了这次用户请求的信息,并提供了许多便捷的方法来获取请求参数或者设置响应信息。框架会将所有的Service挂载到Context实例上,一些插件也会将一些其他方法和对象挂载到它上面

    1. 获取方式
      1. Service : 作为参数ctx传入
      2. Controller : this.ctx
      3. Middleware: 
        1. koa v1: (关键词)this is instance of Context 
        2. koa v2: (参数)ctx is instance of Context
      4. 除了请求外,在有些非用户请求的场景下我们需要访问service/model等Context实例上的对象,可以通过Application.createAnonymousContext()方法创建一个匿名Context实例:
        var Cache = require('js-cache');
        module.exports = app => {
            app.cache = new Cache();
            app.beforeStart(async () => {
                const ctx = app.createAnonymousContext();
                // preload before app start
                await ctx.servive.posts.load();
            })
        
        };

         

      5. 在定时任务中的每一个task都接受一个Context实例作为参数,以便执行一些定时的业务逻辑:

        exports.task = async ctx => {
            await ctx.service.posts.refresh();
        };

         

  3. Request & Response : 请求级别的对象,有一系列获取http请求常用参数和设置http响应的方法

    1. 获取方法:
      1. 可以在Context的实例上获取到当前请求的Request(ctx.request)和Response(ctx.response)实例。
      2. koa会在Context上代理一部分方法和属性(可简写):ctx.request.query.id === ctx.query.id   ctx.response.body === ctx.body。 但ctx.request.body !==  ctx.body
  4. Controller: 框架提供一个Controller基类,并推荐所有的Controller都继承(extends Controller)于该基类实现。

    1. 基类有以下属性:
      1. ctx:当前请求的Context实例
      2. app:应用的Application实例
      3. config:应用的配置
      4. service:应用所有的service
      5. logger:为当前controller封装的logger对象
    2. 引用Controller基类方式:
      'use strict';
      //从 egg 上获取(推荐)
      const Controller = require('egg').Controller;
      
      class HomeController extends Controller {
          async index() {
              this.ctx.body = 'Hello world';
          }
          async fetch() {
              this.ctx.body = this.app.cache.get(this.ctx.query.id);
          }
      }
      
      module.exports = HomeController;
      
      //从 app 实例上获取
      module.exports = app => {
          return class HomeController extends app.Controller {
              //..
          }
      }
      

       

  5. Service: 全都同Controller类

  6. Helper:用来提供一些实用的utility函数。我们可以将一些常用的动作抽离在helper.js里成为独立函数。Helper自身是一个类,有和Controller基类一样的属性,它会在每次请求时进行实例化,因此Helper上的所有函数也能获取到当前请求相关的上下文信息

    1. 获取方式:
      1. 可以在Context实例上获取到当前请求的Helper(ctx.helper)实例。
      2. 还可以在模版中获取到,如在模版中获取security插件提供的shtml方法。{{ helper.shtml(value) }}
    2. 自定义helper方法
      // app/extend/helper.js
      
      module.exports = {
          formatUser(user) {
              return only(user, ['name', 'phone']);
          }
      };

       

  7. Config: 配置文件 

    1. 获取方式
      1. Application: app.config
      2. Controller / Service / Helper:this.config
  8. Logger 日志 每个logger对象都提供了4个级别的方法:logger.debug() / logger.info() / logger.warn() / logger.error() 框架中提供了多个Logger对象

    1. App Logger : 通过app.logger获取 ,可以做一些应用级别的日志记录,如记录启动阶段的一些数据信息,记录一些业务上与请求无关的信息
    2. App CoreLogger: 通过app.coreLogger获取,开发应用时不应使用,框架和插件则需要它打印日志,区分应用和框架打印的日志,与Logger的日志在不同文件
    3. Context Logger:通过ctx.logger从Context实例上获取到它,与请求相关,它打印的日志前会带上一些当前请求相关的信息,(如 [$userId/$ip/$traceId/${cost}ms $method $url]
    4. Context CoreLogger:通过ctx.coreLogger获取,只有框架和插件会通过它来记录日志。
    5. Controller Logger & Service Logger :在Controller Service实例上通过this.logger获取,它本质上就是一个Context Logger,不过在打印日志的时候还会额外的加上文件路径。
  9. Subscription: 规范化订阅模型的基类,可根据自己的需求基于它订阅规范,如定时任务

    1. const Subscription = require('egg').Subscription;
      
      class Schedule extends Subscription {
          // 可以为async function 或 generator function
          async subscribe() {}
      }

       

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值