给萌新的NodeJs技术栈教程(egg篇3)--做一个简单的todolist

76 阅读1分钟

在这个示例中,我们将使用 Egg.js 编写一个简单的 TodoList 小程序,包括增加任务、获取任务列表、更新任务状态和删除任务等功能。为了简化,我们将使用一个内存数组存储任务数据,而不是数据库。

  1. 初始化项目:

按照之前的说明创建一个新的 Egg.js 项目,并安装依赖。

  2定义数据模型:

app/model 目录下创建一个 todo.js 文件,定义一个 Todo 类,用于表示任务对象。

// app/model/todo.js
class Todo {
  constructor(id, title, completed = false) {
    this.id = id;
    this.title = title;
    this.completed = completed;
  }
}

module.exports = Todo;
  1. 3创建服务(Service):

app/service 目录下创建一个 todo.js 文件,定义一个 TodoService 类,用于处理任务相关的业务逻辑。

// app/service/todo.js
const { Service } = require('egg');
const Todo = require('../model/todo');

class TodoService extends Service {
  constructor(ctx) {
    super(ctx);
    this.todos = []; // 使用内存数组存储任务数据
    this.nextId = 1;
  }

  // 创建任务
  create(title) {
    const todo = new Todo(this.nextId++, title);
    this.todos.push(todo);
    return todo;
  }

  // 获取任务列表
  list() {
    return this.todos;
  }

  // 更新任务状态
  update(id, completed) {
    const todo = this.todos.find(t => t.id === id);
    if (todo) {
      todo.completed = completed;
    }
    return todo;
  }

  // 删除任务
  delete(id) {
    const index = this.todos.findIndex(t => t.id === id);
    if (index !== -1) {
      this.todos.splice(index, 1);
    }
  }
}

module.exports = TodoService;
  1. 4 创建控制器(Controller):

app/controller 目录下创建一个 todo.js 文件,定义一个 TodoController 类,用于处理客户端请求并调用服务(Service)。

// app/controller/todo.js
const { Controller } = require('egg');

class TodoController extends Controller {
  async create() {
    const title = this.ctx.request.body.title;
    const todo = this.ctx.service.todo.create(title);
    this.ctx.body = todo;
  }

  async list() {
    const todos = this.ctx.service.todo.list();
    this.ctx.body = todos;
  }

  async update() {
    const id = parseInt(this.ctx.params.id);
    const completed = this.ctx.request.body.completed;
    const todo = this.ctx.service.todo.update(id, completed);
    this.ctx.body = todo;
  }

  async delete() {
    const id = parseInt(this.ctx.params.id);
    this.ctx.service.todo.delete(id);
    this.ctx.status = 204;
  }
}

module.exports = TodoController;
  1. 5 配置路由:

修改 app/router.js 文件,添加路由规则,将 URL 映射到 TodoController 的方法。

// app/router.js
module.exports = app => {
  const { router, controller } = app;
  router.post('/todos', controller.todo.create);
  router.get('/todos', controller.todo.list);
  router.put('/todos/:id', controller.todo.update);
  router.delete('/todos/:id', controller