Egg.js 是一个基于 Koa 构建的高性能 Node.js 应用框架,采用插件化设计,提供丰富的内置工具和插件,简化开发流程。框架支持多种应用场景,如 Web 应用开发、API 服务和微服务架构,并拥有活跃的社区支持。
Egg.js简介Egg.js 是一个基于 Koa 构建的框架,它采用了插件化的设计思路,旨在帮助开发者构建稳定、高性能的 Node.js 应用程序。Egg.js 以“约定优于配置”为核心设计理念,为开发者提供了大量的内置工具和插件,从而大大简化了开发流程。
node -v
和 npm -v
检查是否安装成功。node -v npm -v
npm install -g egg-init
egg-init my-egg-app
cd my-egg-app npm install
app
: 应用的核心代码目录。
controller
: 控制器目录,存放请求处理逻辑。middleware
: 中间件目录,存放自定义的中间件。service
: 服务目录,存放业务逻辑。config
: 配置文件目录。
config.default.js
: 默认配置文件。config.${env}.js
: 环境配置文件(如开发环境、测试环境、生产环境)。public
: 静态资源目录。test
: 测试代码目录。示例代码:
// config.default.js module.exports = app => { // 默认配置 app.config.keys = 'my-secret-key'; };快速上手
app/controller
目录下创建一个 index.js
文件,这是应用的第一个控制器:// app/controller/index.js module.exports = class IndexController { async index(ctx) { ctx.body = 'Hello, Egg.js!'; } };
示例代码:
// app/controller/index.js class IndexController { async index(ctx) { ctx.body = 'Hello, Egg.js!'; } } module.exports = IndexController;
路由配置一般在 config/router.js
文件中进行:
// config/router.js module.exports = function (app) { const { router, controller } = app; router.get('/', controller.index.index); };
示例代码:
// config/router.js module.exports = function (app) { const { router, controller } = app; router.get('/', controller.index.index); };
Egg.js 支持定义中间件来处理请求。中间件一般定义在 app/middleware
目录下,然后在 config/config.default.js
中进行配置:
// app/middleware/logger.js module.exports = () => { return async (ctx, next) => { console.log(`${ctx.method} ${ctx.url}`); await next(); }; };
示例代码:
// config/config.default.js module.exports = app => { // 中间件配置 app.middleware.use('logger'); };数据处理与数据库集成
app/controller
目录下创建控制器来处理数据请求:// app/controller/user.js module.exports = class UserController { async list(ctx) { const list = [ { id: 1, name: 'Alice' }, { id: 2, name: 'Bob' }, ]; ctx.body = list; } };
示例代码:
// app/controller/user.js class UserController { async list(ctx) { const list = [ { id: 1, name: 'Alice' }, { id: 2, name: 'Bob' }, ]; ctx.body = list; } } module.exports = UserController;
使用 Egg.js 连接数据库通常需要安装相应的数据库驱动,例如连接 MySQL 数据库需要安装 egg-mysql
插件:
npm install egg-mysql
配置数据库连接:
// config/config.default.js module.exports = app => { app.config.mysql = { client: 'mysql', host: 'localhost', port: 3306, user: 'root', password: 'root', database: 'test', }; };
示例代码:
// config/config.default.js module.exports = app => { app.config.mysql = { client: 'mysql', host: 'localhost', port: 3306, user: 'root', password: 'root', database: 'test', }; };
CRUD 操作示例:
// app/service/user.js module.exports = class UserService { async getUserById(ctx, id) { const { client } = ctx.app.mysql; const result = await client.query('SELECT * FROM users WHERE id = ?', [id]); return result[0]; } };
示例代码:
// app/service/user.js module.exports = class UserService { async getUserById(ctx, id) { const { client } = ctx.app.mysql; const result = await client.query('SELECT * FROM users WHERE id = ?', [id]); return result[0]; } };
数据验证可以使用 egg-joi
插件实现:
npm install egg-joi
在控制器中进行数据验证:
// app/controller/user.js module.exports = class UserController { async list(ctx) { ctx.assert(ctx.query.id, 400, 'id is required'); const id = ctx.query.id; const user = await ctx.service.user.getUserById(id); ctx.body = user; } };
示例代码:
// app/controller/user.js class UserController { async list(ctx) { ctx.assert(ctx.query.id, 400, 'id is required'); const id = ctx.query.id; const user = await ctx.service.user.getUserById(id); ctx.body = user; } } module.exports = UserController;
错误处理可以通过中间件来实现:
// app/middleware/errorHandler.js module.exports = () => { return async (ctx, next) => { try { await next(); } catch (err) { ctx.body = { error: err.message }; ctx.status = err.status || 500; } }; };
示例代码:
// app/middleware/errorHandler.js module.exports = () => { return async (ctx, next) => { try { await next(); } catch (err) { ctx.body = { error: err.message }; ctx.status = err.status || 500; } }; };性能优化与部署
使用环境变量可以方便地管理不同环境的配置。Egg.js 支持多种环境变量设置方式,例如:
export NODE_ENV=production export MYSQL_HOST=localhost export MYSQL_PORT=3306
在配置文件中使用环境变量:
// config/config.default.js module.exports = app => { app.config.mysql = { client: 'mysql', host: process.env.MYSQL_HOST || 'localhost', port: process.env.MYSQL_PORT || 3306, user: 'root', password: 'root', database: 'test', }; };
示例代码:
// config/config.default.js module.exports = app => { app.config.mysql = { client: 'mysql', host: process.env.MYSQL_HOST || 'localhost', port: process.env.MYSQL_PORT || 3306, user: 'root', password: 'root', database: 'test', }; };
安装 egg-https
插件来启用 HTTPS:
npm install egg-https
配置 SSL 证书:
// config/config.default.js module.exports = app => { app.config.https = { key: fs.readFileSync('/path/to/server.key'), cert: fs.readFileSync('/path/to/server.crt'), }; };
示例代码:
// config/config.default.js module.exports = app => { app.config.https = { key: fs.readFileSync('/path/to/server.key'), cert: fs.readFileSync('/path/to/server.crt'), }; };
打包项目:
npm run build
打包后,项目会生成 dist
目录,里面包含了构建好的代码。
部署到服务器:
cd /path/to/your/project npm install
npm start实战案例与调试技巧
一个完整的 Egg.js 项目通常包括以下几个部分:
示例代码:
// config/router.js module.exports = function (app) { const { router, controller } = app; router.get('/', controller.index.index); router.get('/users', controller.user.list); }; // app/controller/user.js class UserController { async list(ctx) { const users = await ctx.service.user.getAllUsers(); ctx.body = users; } } module.exports = UserController; // app/service/user.js class UserService { async getAllUsers() { const { client } = ctx.app.mysql; const result = await client.query('SELECT * FROM users'); return result; } } module.exports = UserService; // app/middleware/logger.js module.exports = () => { return async (ctx, next) => { console.log(`${ctx.method} ${ctx.url}`); await next(); }; };
process.hrtime()
)分析性能瓶颈。示例代码:
// app/controller/user.js class UserController { async list(ctx) { console.log('Listing users...'); const users = await ctx.service.user.getAllUsers(); ctx.body = users; } }
// config/config.default.js module.exports = app => { app.config.httpTimeout = 30000; };
// config/config.default.js module.exports = app => { app.middleware.use('logger'); };
// config/config.default.js module.exports = app => { app.config.mysql = { client: 'mysql', host: 'localhost', port: 3306, user: 'root', password: 'root', database: 'test', }; };
netstat -an | grep 3000
通过以上内容,你已经掌握了 Egg.js 的基本使用方法和常见问题解决方案,可以开始构建自己的高性能 Web 应用了。