给萌新的NodeJs技术栈教程(egg篇2)--MVC和egg基础

56 阅读2分钟

MVC(Model-View-Controller)是一种软件设计模式,用于将应用程序逻辑分离为三个互相关联的组件:

  1. Model(模型):负责处理数据和业务逻辑。
  2. View(视图):负责展示数据,通常是将模型数据渲染到用户界面。
  3. Controller(控制器):负责接收用户输入,处理请求并更新模型和视图。

MVC 架构有助于实现应用程序的模块化,提高代码的可维护性和可扩展性。

路由与控制器(Controller):

在 Egg.js 中,路由用于定义 URL 和处理请求的控制器之间的映射关系。控制器负责接收客户端发送的请求,处理请求数据,调用服务(Service)层进行业务逻辑处理,并返回响应给客户端。

  1. 路由(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 方法。

  1. 控制器(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;

上述代码中,UserControllerinfo 方法调用了 UserServicegetUserById 方法来获取用户信息,并将结果返回给客户端。