MVC(Model-View-Controller)是一种软件设计模式,用于将应用程序逻辑分离为三个互相关联的组件:
- Model(模型):负责处理数据和业务逻辑。
- View(视图):负责展示数据,通常是将模型数据渲染到用户界面。
- Controller(控制器):负责接收用户输入,处理请求并更新模型和视图。
MVC 架构有助于实现应用程序的模块化,提高代码的可维护性和可扩展性。
路由与控制器(Controller):
在 Egg.js 中,路由用于定义 URL 和处理请求的控制器之间的映射关系。控制器负责接收客户端发送的请求,处理请求数据,调用服务(Service)层进行业务逻辑处理,并返回响应给客户端。
- 路由(Router):
路由配置文件通常位于 app/router.js
。在该文件中,您可以定义路由规则,将 URL 映射到对应的控制器和方法。例如:
module.exports = app => {
const { router, controller } = app;
router.get('/', controller.home.index);
router.get('/user/:id', controller.user.info);
};
上述代码定义了两个路由规则:/
和 /user/:id
。当用户访问这些 URL 时,将分别调用 home
控制器的 index
方法和 user
控制器的 info
方法。
- 控制器(Controller):
控制器通常位于 app/controller
目录下。每个控制器文件都应该导出一个类,类中的方法对应着不同的请求处理逻辑。例如:
// app/controller/home.js
const { Controller } = require('egg');
class HomeController extends Controller {
async index() {
this.ctx.body = 'Hello Egg.js';
}
}
module.exports = HomeController;
上述代码定义了一个 HomeController
类,包含一个 index
方法。该方法通过设置 this.ctx.body
的值来返回响应给客户端。
服务(Service):
服务(Service)层位于 app/service
目录下,主要负责处理业务逻辑和数据操作。将业务逻辑抽象为服务,可以实现代码的模块化和重用,提高开发效率。
服务文件应该导出一个类,类中的方法对应着不同的业务处理逻辑。例如:
// app/service/user.js
const { Service } = require('egg');
class UserService extends Service {
async getUserById(id) {
// 模拟从数据库中获取用户信息
const user = {
id,
name: 'Egg.js User',
age: 25,
};
return user;
}
}
module.exports = UserService;
上述代码定义了一个 UserService
类,包含一个 getUserById
方法。该方法模拟从数据库中获取用户信息。
在控制器中,您可以通过 this.ctx.service
调用服务方法。例如:
// app/controller/user.js
const { Controller } = require('egg');
class UserController extends Controller {
async info() {
const id = this.ctx.params.id;
const user = await this.ctx.service.user.getUserById(id);
this.ctx.body = user;
}
}
module.exports = UserController;
上述代码中,UserController
的 info
方法调用了 UserService
的 getUserById
方法来获取用户信息,并将结果返回给客户端。