egg整体框架结构:
![](https://i-blog.csdnimg.cn/blog_migrate/bebaf44dff3efa6452d449952d48fc14.png)
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
- 日志分类
- ${appInfo.name}-web.log - 应用相关日志,供应用开发者使用的日志。我们在绝大数情况下都在使用它
- egg-web.log - 框架内核、插件日志
- common-error.log - ctx.logger.error输出的 错误日志
- egg-agent.log - 进程日志,框架和使用到 agent 进程执行任务的插件会打印一些日志到这里
- egg-schedule.log - 定时任务的日志
- 日志级别
NONE,DEBUG,INFO,WARN 和 ERROR 5 个级别 - 如何输出日志
ctx.logger.xxx - 如何切割日志
默认自动按照天切割, 也可以手动配置按照大小,按照小时切割
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
可以表示不同的对象,具体取决于代码执行的上下文。下面是一些常见的情况:
-
Controller 中的
this
: 在控制器(Controller)中,this
表示当前控制器实例。你可以通过this
来访问当前请求的上下文(ctx
)、服务(service
)、配置(config
)等。 -
Service 中的
this
: 在服务(Service)中,this
表示当前服务实例。你可以通过this
来访问应用程序上下文(app
)、数据库模型(model
)、帮助函数(helper
)等。 -
Middleware 中的
this
: 在中间件(Middleware)中,this
可能表示当前中间件函数的上下文,具体取决于中间件的实现方式。通常情况下,this
可以访问请求上下文(ctx
)和下一个中间件函数(next
)。 -
Helper 中的
this
: 在帮助函数(Helper)中,this
可以表示当前帮助函数的上下文。通常情况下,帮助函数不依赖于特定的实例或上下文,因此this
可能是undefined
或者指向全局对象。
总的来说,this
关键字在 Egg.js 中的含义取决于代码执行的上下文和所处的位置。在不同的上下文中,this
可以代表不同的对象,你可以根据具体情况来使用它。
中间件加载时间?
在 Egg.js 中,中间件的加载时机取决于中间件的配置和使用方式。
-
应用级中间件: 应用级中间件会在应用启动时加载,并且会在每个请求到达时都会执行。你可以在应用的配置文件
config/config.default.js
中配置应用级中间件,例如:// config/config.default.js module.exports = { middleware: [ 'middleware1', 'middleware2' ], };
这样配置后,
middleware1
和middleware2
这两个应用级中间件会在应用启动时加载,并在每个请求到达时按照顺序执行。 -
路由级中间件: 路由级中间件会根据路由的配置而加载,并在匹配到该路由时执行。你可以在路由配置中使用中间件,例如:
// 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