本文详细介绍了egg.js学习的相关内容,包括Egg.js的基本概念、特点和优势,环境搭建步骤,以及基本概念和配置等。文章还提供了实战演练案例,帮助读者理解如何使用Egg.js实现用户管理模块,最后总结了常见问题及解决方案,帮助读者解决开发过程中遇到的问题。
1. Egg.js简介Egg.js 是一个用于 Node.js 的企业级应用开发框架,它基于 Koa 构建,提供了标准化、结构化的应用开发体系。Egg.js 遵循“约定大于配置”的原则,能够帮助开发者快速构建稳定、安全、高性能的应用。Egg.js 支持模块化开发,可以轻松地扩展和维护项目。
Egg.js 和 Express 都是构建于 Node.js 之上的 Web 应用框架,但它们在设计和实现上有很大的区别。
node -v
和 npm -v
命令,查看 Node.js 和 npm 的版本号。npm install -g egg-init
npm install egg
egg-init myapp --type=official
其中 myapp
是项目的名称,--type=official
表示使用官方模板创建项目。
cd myapp npm run dev
此时 Egg.js 会启动一个开发服务器,并监听 3000 端口。
Egg.js 中的应用配置主要分为全局配置和局部配置。
config/config.default.js
,可以进行全局范围内的配置。config/config.{env}.js
,用于配置特定环境下的配置。全局配置示例:
// config/config.default.js module.exports = appInfo => { const config = {}; // 设置应用端口号 config.port = 3000; // 设置日志输出级别 config.logger = { level: 'info', }; return config; };
局部配置示例:
// config/config.development.js module.exports = appInfo => { const config = {}; // 设置开发环境下的端口号 config.port = 3001; return config; };
Egg.js 的入口文件位于 app.js
,可以通过入口配置来初始化应用。
// app.js const app = require('../egg'); module.exports = app => { // 设置中间件 app.use(async ctx => { ctx.body = 'Hello World'; }); // 设置路由 app.router.get('/', async ctx => { ctx.body = 'Hello World'; }); };
Egg.js 支持通过插件来扩展框架的功能。插件配置主要分为全局插件配置和局部插件配置。
config/plugin.js
。config/plugin.{env}.js
。全局插件配置示例:
// config/plugin.js module.exports = appInfo => { const config = {}; // 启用某个插件 config.somePlugin = { enable: true, }; return config; };
局部插件配置示例:
// config/plugin.development.js module.exports = appInfo => { const config = {}; // 在开发环境下启用某个插件 config.somePlugin = { enable: true, }; return config; };4. 请求处理
Egg.js 中的路由配置主要位于 app/router.js
文件中。可以通过 app.router.get
、app.router.post
等方法来定义路由。
// app/router.js module.exports = app => { app.router.get('/', async ctx => { ctx.body = 'Hello World'; }); app.router.get('/user/:id', async ctx => { ctx.body = `User ID: ${ctx.params.id}`; }); };
控制器文件位于 app/controller
目录下,每个控制器文件对应一个路由模块。控制器中的方法可以处理 HTTP 请求。
// app/controller/home.js module.exports = class HomeController { async index(ctx) { ctx.body = 'Hello World'; } async user(ctx) { const id = ctx.params.id; ctx.body = `User ID: ${id}`; } };
Egg.js 提供了强大的中间件机制,可以通过中间件来处理请求的各个阶段。
// app.js const app = require('../egg'); module.exports = app => { // 定义中间件 const middleware = async ctx => { ctx.request.body = 'Hello World'; }; // 设置中间件 app.use(middleware); // 设置路由 app.router.get('/', async ctx => { ctx.body = ctx.request.body; }); };5. 实战演练
初始化数据库模型:在 app/model
目录下创建 user.js
,定义用户模型。
// app/model/user.js module.exports = app => { const { Sequelize } = app; class User extends app.model.Base { constructor(app) { super(app); this.tableName = 'users'; } async getByName(name) { return await User.findOne({ where: { name } }); } } // 表结构定义 User.associate = function(models) { // 关联表定义 }; return User; };
创建控制器:在 app/controller
目录下创建 user.js
,定义用户相关操作。
// app/controller/user.js module.exports = class UserController { async list(ctx) { const users = await ctx.service.user.list(); ctx.body = users; } async create(ctx) { const { name, age } = ctx.request.body; const user = await ctx.service.user.create({ name, age }); ctx.body = user; } async update(ctx) { const { id, name, age } = ctx.request.body; const user = await ctx.service.user.update(id, { name, age }); ctx.body = user; } async delete(ctx) { const id = ctx.params.id; await ctx.service.user.delete(id); ctx.body = 'User deleted'; } };
创建服务层:在 app/service
目录下创建 user.js
,定义用户相关的业务逻辑。
// app/service/user.js module.exports = app => { class UserService { async list() { const users = await app.model.User.findAll(); return users; } async create(user) { const newUser = await app.model.User.create(user); return newUser; } async update(id, user) { const updatedUser = await app.model.User.update(id, user); return updatedUser; } async delete(id) { await app.model.User.destroy(id); } } return UserService; };
// app/router.js module.exports = app => { const { router, controller } = app; router.get('/users', controller.user.list); router.post('/users', controller.user.create); router.put('/users/:id', controller.user.update); router.delete('/users/:id', controller.user.delete); };
通过上面的代码配置,我们已经实现了用户管理模块的基本功能。现在可以通过 HTTP 请求来操作用户数据。
查询用户列表:
curl http://localhost:3000/users
创建用户:
curl -X POST http://localhost:3000/users -d '{"name": "John", "age": 30}'
更新用户:
curl -X PUT http://localhost:3000/users/1 -d '{"name": "John Doe", "age": 31}'
curl -X DELETE http://localhost:3000/users/1
通过上面的路由配置和控制器编写,我们已经实现了用户管理模块的增删查改功能。下面来详细解释一下路由和控制器的结合方式。
app/router.js
中定义了路由规则,使用 router.get
、router.post
等方法来定义路由。controller.user.list
等方式调用了控制器中的方法来处理请求。404 错误:如果遇到 404 错误,检查路由配置是否正确。
// app/router.js module.exports = app => { app.router.get('/', async ctx => { ctx.body = 'Hello World'; }); };
// app/controller/home.js module.exports = class HomeController { async index(ctx) { ctx.body = 'Hello World'; } };
通过以上内容,您已经掌握了 Egg.js 的基本使用方法和开发技巧。希望这些知识能够帮助您快速构建稳定、安全、高性能的应用。