Egg.js 是一个基于 Koa 的 Web 框架,简化了应用程序的开发流程,使得开发者可以更加专注于业务逻辑的实现。本文将详细介绍 Egg.js 的特点、应用场景以及如何搭建开发环境,帮助读者快速入门 Egg.js。
Egg.js简介Egg.js 是一个用 TypeScript 构建的基于 Koa 的 Web 框架,它简化了应用程序的开发流程,使得开发者可以更加专注于业务逻辑的实现。Egg.js 提供了丰富的插件和中间件支持,使得开发效率大大提高。
egg-mysql
插件来实现数据库连接功能。controller
和 router
目录下。egg-logger
插件自动加载日志中间件。config.development.js
和 config.production.js
文件来配置不同环境下的配置。要使用 Egg.js,首先需要安装 Node.js。Node.js 是一个基于 Chrome V8 引擎的 JavaScript 运行环境,允许开发者使用 JavaScript 编写服务器端应用程序。
node -v npm -v
安装 Egg.js 需要使用 npm(Node.js 的包管理工具)。运行以下命令来安装 Egg.js:
npm install -g egg-init
使用 egg-init
命令创建一个新的 Egg.js 项目。例如,创建一个名为 my-egg-app
的项目:
egg-init my-egg-app
进入项目目录并安装依赖:
cd my-egg-app npm install
启动开发服务器:
npm run dev
此时,你应该可以在浏览器中访问 http://localhost:7001
,并看到默认的 "Hello World!" 页面。
一个典型的 Egg.js 项目包含以下目录结构:
my-egg-app/ ├── app/ │ ├── controller/ │ ├── middleware/ │ ├── router/ │ └── service/ ├── config/ │ ├── config.default.js │ ├── config.development.js │ ├── config.test.js │ └── config.production.js ├── package.json └── README.md
app
目录:存放应用代码,包括控制器、服务、中间件等。config
目录:存放配置文件,其中 config.default.js
是默认配置文件。package.json
:项目的 npm 配置文件。README.md
:项目的说明文档。配置文件位于 config
目录下,这些文件定义了应用的运行时配置。
config.default.js
文件包含了一些基础配置,例如:
module.exports = appInfo => { const config = {}; // 配置端口号 config.port = 7001; // 配置数据库连接 config.mysql = { client: { host: 'localhost', port: '3306', user: 'root', password: 'root', database: 'test', }, dialect: 'mysql', // 是否自动迁移数据库 autoMigrate: true, }; return config; };
config.development.js
用于配置开发环境:
module.exports = appInfo => { const config = {}; // 开发环境允许跨域请求 config.cors = { allowMethods: 'GET,HEAD,PUT,PATCH,POST,DELETE', allowHeaders: 'Content-Type, Authorization, X-Requested-With', }; return config; };
Egg.js 支持丰富的中间件和插件,这些中间件和插件可以方便地进行扩展和定制。
中间件是处理请求和响应的函数。每个中间件可以访问请求和响应对象,也可以调用下一个中间件处理请求。
const Koa = require('koa'); const app = new Koa(); app.use(async (ctx, next) => { console.log(`Processing request ${ctx.request.method} ${ctx.request.url}`); await next(); console.log(`Response sent with status ${ctx.status}`); }); app.use(async ctx => { ctx.body = 'Hello World!'; }); app.listen(7001);
插件是自定义的功能模块,可以方便地扩展 Egg.js 的功能。例如,安装 egg-mysql
插件:
npm install egg-mysql --save
然后在 config.default.js
中配置:
module.exports = appInfo => { const config = {}; config.mysql = { client: { host: 'localhost', port: '3306', user: 'root', password: 'root', database: 'test', }, dialect: 'mysql', // 是否自动迁移数据库 autoMigrate: true, }; return config; };简单实例
创建一个新的控制器 app/controller/hello.js
:
const Controller = require('egg').Controller; class HelloController extends Controller { async index() { const { ctx } = this; ctx.body = 'Hello World!'; } } module.exports = HelloController;
在 config/router.js
中配置路由:
module.exports = app => { const { router, controller } = app; router.get('/', controller.hello.index); };
在 config/config.default.js
中启用文件上传中间件:
module.exports = appInfo => { const config = {}; config.multipart = { whitelist: ['image/*'], fileSize: '10mb', }; return config; };
创建控制器 app/controller/file.js
用于处理文件上传:
const Controller = require('egg').Controller; class FileController extends Controller { async upload() { const { ctx } = this; if (!ctx.request.is('multipart')) { ctx.body = { code: 500, message: 'Not a multipart request.', }; return; } const file = ctx.request.files[0]; ctx.body = { code: 200, message: 'Upload success.', data: { name: file.name, type: file.type, size: file.size, }, }; } } module.exports = FileController;
在 config/router.js
中配置路由:
module.exports = app => { const { router, controller } = app; router.post('/upload', controller.file.upload); };
创建一个中间件 app/middleware/auth.js
用于处理权限验证:
module.exports = ctx => { async function authMiddleware(next) { const { ctx } = this; if (!ctx.session.user) { ctx.body = { code: 401, message: 'Unauthorized.', }; return; } await next(); } return authMiddleware; };
在 config/config.default.js
中启用中间件:
module.exports = appInfo => { const config = {}; config.middleware = [ 'auth', ]; return config; };
创建控制器 app/controller/protected.js
用于保护的 API:
const Controller = require('egg').Controller; class ProtectedController extends Controller { async index() { const { ctx } = this; ctx.body = 'Protected content.'; } } module.exports = ProtectedController;
在 config/router.js
中配置路由:
module.exports = app => { const { router, controller } = app; router.get('/protected', controller.protected.index); };常见问题与调试
lsof -i :7001
命令查看端口是否被占用。config.default.js
中的数据库配置信息是正确的。npm install
确保所有依赖都已安装。app/controller/hello.js
文件中设置断点进行调试。config/config.default.js
中配置日志输出。egg-mock
插件编写单元测试。Egg.js 提供了强大的日志管理功能。可以在 config/config.default.js
中配置日志输出:
module.exports = appInfo => { const config = {}; config.logger = { level: 'info', app: true, env: true, }; return config; };总结与扩展阅读