egg.js企业级web框架

egg整体框架结构:

egg与express、koa的区别

三者皆为node.js web框架,但:

  • express适合做个人项目,灵活性太高;

  • koa由express原班人马打造,相较于express更小、更富有表现力、更健壮,koa与express的主要区别为:

    • 异步编程模型不同,express采用promise,koa采用async / await
    • Middleware处理不同,koa采用了洋葱圈模型
    • Context:和 Express 只有 Request 和 Response 两个对象不同,Koa 增加了一个 Context 的对象,作为这次请求的上下文对象
  • egg是基于koa封装的企业级框架,奉行约定优于配置,按照一套统一的约定进行应用开发,减少开发学习成本,统一代码结构,使开发人员更能专注业务开发;

MVC:Modal、View、Controller。

进一步细化:Service、View、(Router、Conroller)

  • 路由器将请求转发给相应的控制器。
  • 控制器处理用户请求和业务逻辑,通常由后端代码实现。
  • Service负责查询数据库
  • 视图层负责展示数据给用户
    在这里插入图片描述

Controller层

处理请求参数
const Controller = require('egg').Controller;
class HomeController extends Controller{
    async index(){
        this.ctx.body = 'hello world';
    }
    async getQuery(){
        // 获取传统get请求参数
        // this.ctx.request.query
        let query = this.ctx.query;
        this.ctx.body = query;
    }
    async getParams(){
        // 获取动态路由形式的get请求参数
        let params = this.ctx.params;
        this.ctx.body = params;
    }
    async getBody(){
        // 获取post请求参数
        let body = this.ctx.request.body;
        this.ctx.body = body;
    }
}
module.exports = HomeController;
egg处理静态资源

在app/public下的文件被egg作为静态资源服务提供出去。

egg处理动态资源
class HomeController extends Controller{
    async getHome(){
        await this.ctx.render('index', {msg:'hello'});
    }
}
module.exports = {
    keys: '123',
    security: {
        csrf: {
            ignoreJSON: true, // 默认为 false,当设置为 true 时,将会放过所有 content-type 为 `application/json` 的请求
        },
    },
    view:{
        mapping:{
            '.html':'ejs'
        }
    }
};
egg处理cookie
const Controller = require('egg').Controller;

class HomeController extends Controller{
    async setCookie(){
        this.ctx.cookies.set('name', 'ww', {
            path:'/',
            maxAge: 24 * 60 * 60 * 1000,
            httpOnly: true,
            /*
            在EggJS中, 为了安全着想, 阿里的安全专家建议我们在设置Cookie的时候, 给保存的数据生成一个签名
            将来获取数据的时候, 再利用获取到的数据生成一个签名, 和当初保存的时候的签名进行对比
            如果一致, 表示保存在客户端的数据没有被篡改, 如果不一致表示保存在客户端的数据已经被篡改
            * */
            signed: true, // 根据config/config.default.js中的keys来生成签名
            encrypt: true // 让EggJS帮我们加密之后再保存
        });
        this.ctx.body = '设置成功';
    }
    async getCookie(){
        let cookie = this.ctx.cookies.get('name', {
            signed: true,
            encrypt: true
        });
        this.ctx.body = `获取Cookie成功 = ${cookie}`;
    }
}

module.exports = HomeController;

Service层

service中的js文件, 如果是以_或者首字母都是大写, 那么在调用的时候必须转换成驼峰命名:

  • get_user.js — getUser
  • GetUser.js — getUser

egg中常用插件

body-parse

body-parser是非常常用的一个express中间件,作用是对post请求请求体进行解析。使用非常简单。在egg中,内置了koa-bodyparser这个类似作用的中间件。

egg记录日志并自动默认按天进行分割

参考:https://www.eggjs.org/zh-CN/core/logger#%E6%97%A5%E5%BF%97%E5%88%87%E5%89%B2

  1. 日志分类
    • ${appInfo.name}-web.log - 应用相关日志,供应用开发者使用的日志。我们在绝大数情况下都在使用它
    • egg-web.log - 框架内核、插件日志
    • common-error.log - ctx.logger.error输出的 错误日志
    • egg-agent.log - 进程日志,框架和使用到 agent 进程执行任务的插件会打印一些日志到这里
    • egg-schedule.log - 定时任务的日志
  2. 日志级别
    NONE,DEBUG,INFO,WARN 和 ERROR 5 个级别
  3. 如何输出日志
    ctx.logger.xxx
  4. 如何切割日志
    默认自动按照天切割, 也可以手动配置按照大小,按照小时切割

egg定时任务

egg启动自定义

参考链接:https://www.eggjs.org/zh-CN/basics/app-start

egg框架扩展

const Controller = require('egg').Controller;

class HomeController extends Controller{
    async test(){
        // console.log(this.ctx.app.myTest('123'));
        // console.log(this.ctx.myTest('abc'));
        // console.log(this.ctx.request.myTest('666'));
        // console.log(this.ctx.response.myTest('888'));
        console.log(this.ctx.helper.md5('abc123'));
        await this.ctx.render('index', {msg:'www.it666.com'});
    }
}
module.exports = HomeController;

在这里插入图片描述

egg中的this代表什么?

在 Egg.js 中,this 关键字通常指代当前执行上下文的对象。具体来说,在 Egg.js 中,this 可以表示不同的对象,具体取决于代码执行的上下文。下面是一些常见的情况:

  1. Controller 中的 this 在控制器(Controller)中,this 表示当前控制器实例。你可以通过 this 来访问当前请求的上下文(ctx)、服务(service)、配置(config)等。

  2. Service 中的 this 在服务(Service)中,this 表示当前服务实例。你可以通过 this 来访问应用程序上下文(app)、数据库模型(model)、帮助函数(helper)等。

  3. Middleware 中的 this 在中间件(Middleware)中,this 可能表示当前中间件函数的上下文,具体取决于中间件的实现方式。通常情况下,this 可以访问请求上下文(ctx)和下一个中间件函数(next)。

  4. Helper 中的 this 在帮助函数(Helper)中,this 可以表示当前帮助函数的上下文。通常情况下,帮助函数不依赖于特定的实例或上下文,因此 this 可能是 undefined 或者指向全局对象。

总的来说,this 关键字在 Egg.js 中的含义取决于代码执行的上下文和所处的位置。在不同的上下文中,this 可以代表不同的对象,你可以根据具体情况来使用它。

中间件加载时间?

在 Egg.js 中,中间件的加载时机取决于中间件的配置和使用方式。

  1. 应用级中间件: 应用级中间件会在应用启动时加载,并且会在每个请求到达时都会执行。你可以在应用的配置文件 config/config.default.js 中配置应用级中间件,例如:

    // config/config.default.js
    module.exports = {
      middleware: [ 'middleware1', 'middleware2' ],
    };
    

    这样配置后,middleware1middleware2 这两个应用级中间件会在应用启动时加载,并在每个请求到达时按照顺序执行。

  2. 路由级中间件: 路由级中间件会根据路由的配置而加载,并在匹配到该路由时执行。你可以在路由配置中使用中间件,例如:

    // app/router.js
    module.exports = app => {
     const { router, middleware } = app;
     const adminAuth = middleware.adminAuth(); // 路由级中间件
    
     router.get('/admin', adminAuth, controller.admin.index);
    };
    

    这样配置后,adminAuth 这个路由级中间件会在匹配到 /admin 路由时加载并执行。

总的来说,中间件的加载时机取决于中间件的配置方式,但一般来说,中间件会在应用启动时加载(应用级中间件),或在路由匹配时加载(路由级中间件)。

国际化

Nginx反向代理服务器

解决cookie跨域问题

链接: https://pan.baidu.com/s/1yMSbi2O_vIK7BkaSc8Hw7g?pwd=1fr9

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

. . . . .

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值