egg.js教程从入门到放弃(app目录规范解读,按需ejs)
'use strict';
/**
* @param {Egg.Application} app - egg application
*/
module.exports = app => {
const { router, controller } = app;
router.get('/', controller.home.index);
};
1.app/router.js
打开app/router.js,会看到当访问http://127.0.0.1:7001 (即http://127.0.0.1:7001/)时,走的是controller.admin.index
2.app/controller/home.js
打开app/controller/home.js,会看到ctx.body="hi,ComedyEgg"上面还有const{ctx}=this,这便是egg.js跟koa的微妙区别,koa是直接ctx.body=""给用户响应信息,而egg是对koa进行了再封装,egg把ctx.body这个对象放到了this身上,即this.ctx.body="响应内容";
'use strict';
const Controller = require('egg').Controller;
class HomeController extends Controller {
async index() {
const { ctx } = this;
ctx.body = 'hi, ComedyEgg';
}
}
module.exports = HomeController;
3.新增controller.admin.index
(1)在app/controller目录下新建admin.js
(2)模板书写(如果vsCode下载了egg扩展的话直接键入egg,然后选择egg controller)
(3)新增 async index()方法
'use strict';
module.exports = app => {
class AdminController extends app.Controller {
async index(){
console.log(this);
//egg给用户响应信息 koa ctx.body="ComedyAdmin"
this.ctx.body="ComedyAdmin";
}
}
return AdminController;
};
(4)将admin添加到路由
'use strict'; /** * @param {Egg.Application} app - egg application */ module.exports = app => { const { router, controller } = app; router.get('/', controller.home.index); router.get('/admin',controller.admin.index); };
(5)浏览器url键入http://127.0.0.1:7001/admin
4.app/public
app/public目录是静态资源目录,存放css,js,images
5.新增app/view目录并使用ejs后端渲染
该目录用于存放前端模板文件。比如在koa里面我经常用的是ejs,那么可以在view/comedy.ejs,然后配置好,在对应方法里面await this.ctx.render('')
即可实现用户->router->controller->view
(1).安装ejs :npm i egg-view-ejs -d
(2).修改配置文件
(2)_01:config/plugin.js
'use strict'; /** @type Egg.EggPlugin */ // module.exports = { // // had enabled by egg // // static: { // // enable: true, // // } // }; exports.ejs = { enable:true, package:'egg-view-ejs' }
(2)_02:config/config.default.js
/* eslint valid-jsdoc: "off" */ 'use strict'; /** * @param {Egg.EggAppInfo} appInfo app info */ module.exports = appInfo => { /** * built-in config * @type {Egg.EggAppConfig} **/ const config = exports = {}; // use for cookie sign key, should change to your own and keep security config.keys = appInfo.name + '_1602733885132_3361'; //EJS——20201015 comedy add config.view = { mapping:{ '.html':'ejs', }, }; // add your middleware config here config.middleware = []; // add your user config here const userConfig = { // myAppName: 'egg', }; return { ...config, ...userConfig, }; };
(3).从(2)可以看出扩展名ejs被改成了.html,那么新建的前端模板文件依然叫做comedy.html,而不是comedy.ejs。
(4).配置路由,当用户访问那个url时给他展示comedy.html,我这里写的是当用户访问coemdy时执行admin控制器的comedy方法。
(5).在admin控制器新增comedy方法以及render文件comedy.html,并提供数据供渲染
async comedy(){
await this.ctx.render('../view/comedy.html',{ data:"comedyEjsData" })
}
(6).运行效果
6.app/service (model)
egg是一个MVC框架,app/view是视图(页面的展示),app/controller是控制器(业务逻辑处理),app/service是模型(请求数据)。
egg规定必须使用service而不能model,如果非要model的话也得是service/model
7.app/middleware
中间件
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异
· 三行代码完成国际化适配,妙~啊~