返回

利用Egg.js迅速搭建现代化商业应用

前端

前言

在现代Web开发中,框架的使用已成为常态,它可以帮助我们快速构建应用,而无需浪费时间在重复的编码上。而在众多Node.js框架中,Egg.js凭借其强大的功能和易用性,已经成为众多开发者的首选。

本文将通过一步步的实践,带领你使用Egg.js搭建一个商用应用,该应用将包含用户注册、登录、商品管理等功能,并使用Swagger UI生成API文档。

搭建项目

首先,需要安装Egg.js CLI工具:

npm install -g egg-bin

然后创建一个新的项目:

egg init my-egg-app

该命令将在当前目录下创建一个名为my-egg-app的新项目。

配置数据库

接下来,需要配置数据库。本文将使用MySQL作为数据库,因此需要先安装MySQL驱动:

npm install mysql

然后在config/config.default.js文件中添加数据库配置:

module.exports = {
  mysql: {
    client: {
      // host
      host: '127.0.0.1',
      // port
      port: '3306',
      // username
      user: 'root',
      // password
      password: 'password',
      // database
      database: 'my_egg_app',
    },
    // load into app, default is open
    app: true,
    // load into agent, default is close
    agent: false,
  },
};

集成中间件

接下来,需要集成一些必要的中间件。本文将集成以下中间件:

  • body-parser: 解析请求体
  • helmet: 设置HTTP头以提高安全性
  • cors: 允许跨域请求

在config/plugin.js文件中添加以下内容:

module.exports = {
  bodyParser: {
    enable: true,
    encoding: 'utf8',
  },
  helmet: {
    enable: true,
  },
  cors: {
    enable: true,
    package: 'egg-cors',
  },
};

创建模型

接下来,需要创建模型。模型是用来数据库表结构的。本文将创建一个User模型和一个Product模型。

在app/model/user.js文件中添加以下内容:

module.exports = app => {
  const { STRING, INTEGER } = app.Sequelize;

  const User = app.model.define('user', {
    id: { type: INTEGER, primaryKey: true, autoIncrement: true },
    username: { type: STRING(30), allowNull: false },
    password: { type: STRING(30), allowNull: false },
  });

  return User;
};

在app/model/product.js文件中添加以下内容:

module.exports = app => {
  const { STRING, INTEGER, DATE } = app.Sequelize;

  const Product = app.model.define('product', {
    id: { type: INTEGER, primaryKey: true, autoIncrement: true },
    name: { type: STRING(30), allowNull: false },
    price: { type: INTEGER, allowNull: false },
    created_at: { type: DATE, allowNull: false },
    updated_at: { type: DATE, allowNull: false },
  });

  return Product;
};

创建服务

服务是用来处理业务逻辑的。本文将创建一个UserService和一个ProductService。

在app/service/user.js文件中添加以下内容:

module.exports = app => {
  class UserService extends app.Service {
    async register(username, password) {
      const user = await this.ctx.model.User.create({ username, password });
      return user;
    }

    async login(username, password) {
      const user = await this.ctx.model.User.findOne({ where: { username, password } });
      return user;
    }
  }

  return UserService;
};

在app/service/product.js文件中添加以下内容:

module.exports = app => {
  class ProductService extends app.Service {
    async create(name, price) {
      const product = await this.ctx.model.Product.create({ name, price });
      return product;
    }

    async list() {
      const products = await this.ctx.model.Product.findAll();
      return products;
    }

    async update(id, name, price) {
      const product = await this.ctx.model.Product.findByPk(id);
      product.name = name;
      product.price = price;
      await product.save();
      return product;
    }

    async delete(id) {
      const product = await this.ctx.model.Product.findByPk(id);
      await product.destroy();
      return product;
    }
  }

  return ProductService;
};

创建控制器

控制器是用来处理HTTP请求的。本文将创建一个UserController和一个ProductController。

在app/controller/user.js文件中添加以下内容:

module.exports = app => {
  class UserController extends app.Controller {
    async register() {
      const { username, password } = this.ctx.request.body;
      const user = await this.service.user.register(username, password);
      this.ctx.body = {
        code: 0,
        data: user,
        msg: '注册成功',
      };
    }

    async login() {
      const { username, password } = this.ctx.request.body;
      const user = await this.service.user.login(username, password);
      this.ctx.body = {
        code: 0,
        data: user,
        msg: '登录成功',
      };
    }
  }

  return UserController;
};

在app/controller/product.js文件中添加以下内容:

module.exports = app => {
  class ProductController extends app.Controller {
    async create() {
      const { name, price } = this.ctx.request.body;
      const product = await this.service.product.create(name, price);
      this.ctx.body = {
        code: 0,
        data: product,
        msg: '创建成功',
      };
    }

    async list() {
      const products = await this.service.product.list();
      this.ctx.body = {
        code: 0,
        data: products,
        msg: '获取成功',
      };
    }

    async update() {
      const { id, name, price } = this.ctx.request.body;
      const product = await this.service.product.update(id, name, price);
      this.ctx.body = {
        code: 0,
        data: product,
        msg: '更新成功',
      };
    }

    async delete() {
      const { id } = this.ctx.request.body;
      const product = await this.service.product.delete(id);
      this.ctx.body = {
        code: 0,
        data: product,
        msg: '删除成功',
      };
    }
  }

  return ProductController;
};

集成Swagger UI

Swagger UI是一个用于生成API文档的工具。本文将集成Swagger UI来生成API文档。

在config/plugin.js文件中添加以下内容:

swagger: {
  enable: true,
  package: 'egg-swagger-ui',
},

在app.js文件中添加以下内容:

const swaggerUI = require('egg-swagger-ui');

// 添加Swagger UI的路由
app.use('/swagger-ui', swaggerUI.routes(), swaggerUI.staticFiles());

// 扫描API文档注释并生成文档
app.swaggerize();

启动项目

最后,启动项目:

npm start

访问http://localhost:7001/swagger-ui即可查看API文档。

结语

本文通过一步步的实践,带领你使用Egg.js搭建了一个商用应用,该应用包含用户注册、登录、商品管理等功能,并使用Swagger UI