Egg.js 为企业级框架和应用而生。使用 MVC 架构模型指导开发,使得开发大型 Web 应用变得简单且易于维护。

特性

  • 提供基于 Egg 定制上层框架的能力
  • 高度可扩展的插件机制
  • 内置多进程管理
  • 基于 Koa 开发,性能优异
  • 框架稳定,测试覆盖率高
  • 渐进式开发
  • 一个插件只做一件事
  • 约定优于配置

    Egg 初始化过程

自动初始化

1、使用官方提供的脚手架(项目模板),来初始化一个空的 Egg 项目。

  1. # 创建一个空目录,如果使用终端创建空目录就是如下的命令
  2. mkdir api-egg
  3. # 进入到空目录
  4. cd api-egg
  5. # 使用 egg-init 进行初始化
  6. npm init egg --type=simple
  7. # 安装依赖
  8. npm i

手动初始化

  1. # 创建一个空目录,如果使用终端创建空目录就是如下的命令
  2. mkdir api-egg
  3. # 进入到空目录
  4. cd api-egg
  5. # 初始化成 node 项目,并安装 egg 开发相关的依赖
  6. npm init -y
  7. npm i egg-bin -D
  8. npm i egg -S

创建一个处理请求的控制器

在项目根目录下,创建 app/controller/home.js,添加如下内容:

  1. const { Controller } = require("egg");
  2. class HomeController extends Controller {
  3. /**
  4. * 欢迎页
  5. */
  6. async index() {
  7. this.ctx.body = "Hi, egg ~";
  8. }
  9. }
  10. module.exports = HomeController;

配置路由

意义:我们要把控制器方法映射给一个路径,当客户端访问这个路径时,就执行对应的控制器方法。

步骤:项目根目录下,新建 app/router.js 文件,加入如下代码:

  1. module.exports = (app) => {
  2. const { controller, router } = app;
  3. // 定义根路由
  4. router.get("/", controller.home.index);
  5. };

配置应用加密秘钥

意义:主要用于加密我们应用中的 cookie。

步骤:项目根目录下,新建 config/config.default.js 文件,导出一个配置对象:

  1. module.exports = {
  2. keys: "hahahahahahha",
  3. };

配置项目启动命令

步骤:在项目根目录下 package.json 文件中,加入如下脚本命令:

  1. "scripts": {
  2. "dev": "egg-bin dev"
  3. },

启动项目

  1. npm run dev

打开浏览器,访问:http://localhost:7001 即可看到 “Hi, egg ~”。

集成 MySQL

Egg 框架提供插件机制,可以通过插件集成其他应用程序。

安装 MySQL 插件依赖

  1. npm i egg-mysql -S

创建 MySQL 服务器的连接配置

步骤:在 config/config.default.js 文件中,加入 MySQL 连接配置:

  1. module.exports = {
  2. keys: "hahahha",
  3. mysql: {
  4. client: {
  5. host: "localhost",
  6. port: 3306,
  7. user: "root",
  8. password: "root",
  9. database: "blog",
  10. },
  11. },
  12. };

启动 MySQL 插件

步骤:在项目根目录下,新建 config/plugin.js 文件,加入如下代码:

  1. module.exports = {
  2. mysql: {
  3. enable: true,
  4. package: "egg-mysql",
  5. },
  6. };

创建一个用户 service 用于处理 MySQL 查询

步骤:在项目根目录下,新建 app/service/user.js 文件:

  1. const { Service } = require("egg");
  2. class UserService extends Service {
  3. /**
  4. * 根据用户名,查询该用户信息
  5. * @param {string} username 用户名
  6. */
  7. async findByUsername(username) {
  8. let sql = "select * from user where username = ?";
  9. let params = [username];
  10. let res = await this.app.mysql.query(sql, params);
  11. return res[0];
  12. }
  13. }
  14. module.exports = UserService;

关闭 CSRF 校验

如果我们使用 Egg 开发多页面应用,就会涉及到 CSRF(跨站请求伪造)攻击。

因为我们开发的是数据接口服务,不涉及到页面展示,所以不需要这一安全防范,关闭即可。

该功能是 egg-security 插件提供的,我们只需要将其关闭即可。

config/config.default.js 文件中,关闭:

  1. module.exports = {
  2. // ...
  3. security: {
  4. csrf: false,
  5. },
  6. };