为了账号安全,请及时绑定邮箱和手机立即绑定

Egg.js项目实战:新手入门教程

概述

本文将详细介绍如何从零开始搭建和运行一个Egg.js项目,并通过实战案例逐步深入讲解用户注册与登录功能的实现。此外,文章还将指导读者完成项目的打包、部署和监控,帮助读者全面掌握Egg.js项目实战。

Egg.js简介

什么是Egg.js

Egg.js 是一个由阿里巴巴开源的基于 Koa 2 的框架,它借鉴和整合了 Express、Koa 和其他流行框架的优点,旨在提供一个高性能、可扩展和易于维护的 Node.js 应用开发框架。Egg.js 内置了多个核心功能,如路由、中间件、插件管理、日志、错误处理等,使得开发者可以专注于业务逻辑的实现。

Egg.js的优势

  1. 高性能:Egg.js 使用 Koa 2 作为底层引擎,Koa 2 本身基于 Node.js 的非阻塞 I/O 和事件驱动模型实现了高性能。
  2. 可扩展性:Egg.js 提供了丰富的插件系统,支持根据应用需求加载和卸载插件。这使得开发者可以灵活地对框架进行扩展,以满足复杂的应用场景。
  3. 易维护性:Egg.js 定义了清晰的项目结构,使得代码组织更加清晰。并且,Egg.js 提供了丰富的文档和社区支持,有助于开发者快速上手和解决问题。
  4. 生态丰富:Egg.js 拥有丰富的插件和第三方库,社区活跃,提供了大量的开发工具和资源,使开发过程更加高效。

Egg.js与Express的区别

  • 底层引擎:Egg.js 使用 Koa 2 作为底层引擎,而 Express 使用 Connect 作为中间件支持。
  • 中间件:Egg.js 使用 async/await 语法实现中间件,而 Express 使用回调函数。
  • 插件支持:Egg.js 提供了更丰富的插件支持和管理机制,而 Express 的插件管理相对简单。
  • 项目结构:Egg.js 有严格的项目结构要求,使得代码组织更加规范,而 Express 的项目结构相对灵活。
环境搭建

安装Node.js

安装 Node.js 是运行 Egg.js 项目的基础。Node.js 是一个基于 Chrome V8 引擎的 JavaScript 运行环境。首先,访问 Node.js 官方网站 https://nodejs.org/,下载最新版本的 Node.js 并安装。

安装完成后,可以通过以下命令验证 Node.js 是否安装成功:

$ node -v

安装成功后,终端会输出 Node.js 的版本号。

使用npm安装Egg.js

Node.js 安装完成后,可以使用 npm(Node Package Manager)来安装 Egg.js。Egg.js 作为一个 npm 包,可以通过 npm 安装到本地。

首先,确保已经安装了 npm。如果尚未安装,可以通过 Node.js 安装包一起安装。接下来,使用 npm 全局安装 Egg.js:

$ npm install -g egg-init

安装完成后,可以在命令行中使用 egg-init 命令来初始化一个新的 Egg.js 项目。

初次运行Egg.js项目

安装 Egg.js 后,可以使用 egg-init 命令生成一个新的 Egg.js 项目。例如,创建一个名为 my-app 的新项目:

$ egg-init my-app

这会生成一个基本的 Egg.js 项目结构。

接下来,进入项目目录并启动项目:

$ cd my-app
$ npm install
$ npm start

启动完成后,访问 http://localhost:7001,可以看到默认的欢迎页面。

创建第一个Egg.js项目

初始化Egg.js项目

创建一个新的 Egg.js 项目可以使用 egg-init 命令,如上文所述。以下是初始化一个名为 hello-world 的项目的示例:

$ egg-init hello-world
$ cd hello-world
$ npm install

项目结构解析

Egg.js 项目的目录结构通常如下:

hello-world/
├── app/
│   ├── config/
│   │   ├── default.js
│   │   └── local.js
│   ├── controller/
│   │   └── home.js
│   ├── router/
│   │   └── home.js
│   └── service/
├── config/
│   ├── config.default.js
│   └── config.local.js
├── package.json
└── README.md
  • app/:包含应用的核心代码,如控制器、路由和中间件。
  • app/config/:包含应用的配置文件。
  • app/controller/:存放控制器文件,处理 HTTP 请求。
  • app/router/:存放路由文件,定义 URL 的映射关系。
  • config/:存放全局配置文件,如 config.default.jsconfig.local.js
  • package.json:项目配置文件,用于管理依赖。

例如,在 app/controller/home.js 文件中,可以定义一个简单的控制器:

module.exports = {
  hello: ctx => {
    ctx.body = 'Hello world';
  },
};

app/router/home.js 文件中,定义一个路由,将 GET 请求映射到刚刚创建的控制器:

module.exports = app => {
  const { router, controller } = app;
  router.get('/', controller.home.hello);
};

现在,重启服务并通过访问 http://localhost:7001 查看结果。

项目定义与启动

创建一个简单的Egg.js项目,首先初始化项目:

$ egg-init my-app
$ cd my-app
$ npm install

config/config.default.js 中,可以配置应用的基本设置:

module.exports = {
  // 默认端口
  port: 7001,
};

app/controller/home.js 中,定义一个简单的控制器:

module.exports = {
  hello: ctx => {
    ctx.body = 'Hello world';
  },
};

app/router/home.js 中,定义一个路由,将 GET 请求映射到刚刚创建的控制器:

module.exports = app => {
  const { router, controller } = app;
  router.get('/', controller.home.hello);
};

启动项目并访问 http://localhost:7001 查看结果。

常见配置与优化

配置文件介绍

Egg.js 的配置文件位于 config 目录下,主要有 config.default.jsconfig.local.jsconfig.default.js 包含默认配置,而 config.local.js 用于覆盖默认配置以适应特定环境(如开发、测试、生产等)。

示例 config.default.js 文件:

module.exports = {
  // 默认端口
  port: 7001,
  // 数据库配置
  db: {
    type: 'mysql',
    config: {
      host: 'localhost',
      port: 3306,
      user: 'root',
      password: 'password',
      database: 'example',
    },
  },
};

环境变量配置

Egg.js 支持环境变量配置,可以将敏感信息(如数据库密码、API 密钥等)存储在环境变量中,避免硬编码。

示例配置:

module.exports = {
  port: process.env.PORT || 7001,
  db: {
    type: 'mysql',
    config: {
      host: process.env.DB_HOST || 'localhost',
      port: process.env.DB_PORT || 3306,
      user: process.env.DB_USER || 'root',
      password: process.env.DB_PASSWORD || 'password',
      database: process.env.DB_NAME || 'example',
    },
  },
};

日志配置

Egg.js 提供了强大的日志系统,可以按不同日志级别和格式输出日志。日志配置文件位于 config/config.default.js,可以通过修改 logger 配置来调整日志行为。

示例日志配置:

module.exports = {
  logger: {
    level: 'info', // 日志级别
    console: {
      color: false, // 控制台日志颜色
      json: false, // 是否输出 JSON 格式
    },
  },
};
实战案例:用户注册与登录功能

数据库连接配置

首先,在 config.default.js 文件中配置数据库连接信息:

module.exports = {
  db: {
    type: 'mysql',
    config: {
      host: 'localhost',
      port: 3306,
      user: 'root',
      password: 'password',
      database: 'userdb',
    },
  },
};

然后,在 app/config/config.default.js 中引入 Sequelize(推荐的 ORM 工具):

const Sequelize = require('sequelize');
const config = require('config');

module.exports = {
  // 数据库配置
  sequelize: new Sequelize(config.db.database, config.db.user, config.db.password, {
    host: config.db.host,
    dialect: 'mysql',
    logging: false,
  }),
};

用户模型设计

创建一个新的模型文件 app/model/User.js

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

  class User extends Model {}

  User.init({
    username: {
      type: Sequelize.STRING,
      allowNull: false,
    },
    password: {
      type: Sequelize.STRING,
      allowNull: false,
    },
  }, {
    sequelize: app.sequelize,
    tableName: 'users',
  });

  return User;
};

创建数据库表:

const { User } = require('../model/User');

User.sync({ force: true }).then(() => {
  // 表已创建
});

实现用户注册与登录

首先,在 app/controller/user.js 中实现注册和登录功能:

const { User } = require('../model/User');

module.exports = {
  async register(ctx) {
    const { username, password } = ctx.request.body;
    try {
      const user = await User.create({ username, password });
      ctx.body = { success: true, message: '用户注册成功' };
    } catch (err) {
      ctx.body = { success: false, message: err.message };
    }
  },

  async login(ctx) {
    const { username, password } = ctx.request.body;
    try {
      const user = await User.findOne({ where: { username, password } });
      if (!user) {
        ctx.body = { success: false, message: '用户名或密码错误' };
      } else {
        ctx.body = { success: true, message: '登录成功' };
      }
    } catch (err) {
      ctx.body = { success: false, message: err.message };
    }
  },
};

创建相应的路由文件 app/router/user.js

module.exports = app => {
  const { router, controller } = app;
  router.post('/register', controller.user.register);
  router.post('/login', controller.user.login);
};

现在,通过访问 POST /registerPOST /login 接口,可以实现用户注册和登录功能。

项目部署与发布

打包项目

为了将本地项目部署到生产环境,可以使用 npm run build 命令打包项目:

$ npm run build

打包完成后,app 目录下的代码会被压缩和优化,更适合部署到生产环境。打包后的目录结构类似于:

dist/
├── app/
│   ├── config/
│   ├── controller/
│   ├── router/
│   └── service/
├── config/
└── package.json

部署到云服务器

将打包好的项目文件上传到云服务器,例如使用 scp 命令将本地文件上传到服务器:

$ scp -r ./dist user@yourserver:/path/to/your/app

然后,使用 ssh 登录服务器并启动项目:

$ ssh user@yourserver
$ cd /path/to/your/app
$ npm install
$ npm start

监控与日志查看

使用工具如 PM2 来管理 Egg.js 应用的运行:

$ npm install pm2 -g
$ pm2 start app.js --name your-app
$ pm2 logs

这可以方便地查看日志和进行应用的管理和监控。

总结

本文详细介绍了如何从零开始搭建和运行 Egg.js 项目,并通过用户注册与登录功能的实现,帮助读者深入理解 Egg.js 的实际应用。同时,通过项目打包、部署和监控的指导,读者可以更好地掌握 Egg.js 项目的实战技巧。

点击查看更多内容
TA 点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
  • 推荐
  • 评论
  • 收藏
  • 共同学习,写下你的评论
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消