在这个示例中,我们将使用 Egg.js 编写一个简单的 TodoList 小程序,包括增加任务、获取任务列表、更新任务状态和删除任务等功能。为了简化,我们将使用一个内存数组存储任务数据,而不是数据库。
- 初始化项目:
按照之前的说明创建一个新的 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;
- 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;
- 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;
- 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