Egg.js 项目实战:新手入门教程
本文将详细介绍如何从零开始构建一个Egg.js项目,包括环境搭建、项目创建、基本结构解析和配置文件介绍。此外,还将探讨路由与控制器的使用、模板引擎与视图的集成、数据库连接和ORM操作,以及模块化开发与中间件的使用,帮助你全面掌握Egg.js项目实战。
Egg.js 项目实战:新手入门教程 Egg.js 简介与环境搭建Egg.js 是什么
Egg.js 是一个基于 Koa 的 Web 应用开发框架。它借鉴了 Express.js 的设计理念,同时也结合了 Koa.js 的优秀特性。Egg.js 主要用于构建 Node.js 的企业级应用,具有丰富的功能和高度的可扩展性。Egg.js 的设计理念是“约定优于配置”,它通过约定自动完成了许多底层配置和初始化工作,使得开发者可以更加专注于业务逻辑的实现。
安装 Node.js 与 NPM
在开始使用 Egg.js 之前,你需要确保已经安装了 Node.js 和 NPM(Node Package Manager)。你可以通过以下步骤安装:
- 访问 Node.js 官方网站 并下载最新版本的 Node.js。安装过程中,Node.js 会自动安装 NPM。
- 安装完成后,可以通过以下命令检查是否安装成功:
node -v npm -v
这将打印出你安装的 Node.js 和 NPM 的版本号。
创建第一个 Egg.js 项目
安装完 Node.js 和 NPM 后,你可以使用 Egg.js 的命令行工具 egg-init
来创建一个新的 Egg.js 项目。以下是创建项目的步骤:
- 安装
egg-init
工具:npm i egg-init -g
- 在你的开发目录下使用
egg-init
命令创建一个新的项目:egg-init my-egg-app
这将创建一个名为
my-egg-app
的目录,并在其中初始化一个 Egg.js 项目。 - 进入项目目录并安装依赖:
cd my-egg-app npm install
- 启动项目:
npm run dev
这将启动开发服务器,并监听端口 7001。
在浏览器中访问 http://localhost:7001
,你将看到默认的 "Hello world" 页面,这标志着你的 Egg.js 项目已经成功启动。
项目目录结构解析
Egg.js 项目的基本目录结构如下:
app
: 应用的核心模块,包括控制器(controller)、服务(service)、模型(model)、中间件(middleware)等。config
: 配置文件目录,用于存放项目的配置文件。public
: 静态资源目录,存放 CSS、JavaScript、图片等静态文件。test
: 测试用例目录,存放项目的测试代码。app.js
: 应用的入口文件。config/config.default.js
: 项目的默认配置文件。.npmignore
、.editorconfig
、.gitignore
等配置文件。
配置文件介绍
配置文件主要存放在 config
目录中。一些常用的配置文件包括:
config/config.default.js
: 项目的默认配置文件,你可以在此文件中修改项目的一些默认配置。config/config.{env}.js
: 根据不同的环境(如开发、测试、生产)分别配置,如config/config.development.js
。
示例代码:
// config/config.default.js
module.exports = appInfo => {
const config = {};
// 通用中间件配置
config.middleware = [];
// 开发环境配置
if (appInfo.env === 'development') {
config.middleware.push('logger');
}
return config;
};
// config/config.development.js
module.exports = appInfo => {
const config = {};
// 开发环境的特定配置
config.security = {
noCache: true,
};
return config;
};
路由与控制器
创建路由
Egg.js 使用 router
模块来定义路由。路由定义了 URL 和相应的处理函数之间的映射关系。你可以在 app/router.js
文件中定义路由。
示例代码:
// app/router.js
const Router = require('koa-router');
const router = new Router();
router.get('/', async (ctx, next) => {
await next();
});
router.get('/user', async (ctx, next) => {
await next();
});
module.exports = router;
编写控制器逻辑
控制器负责处理用户的请求,并返回相应的响应。控制器逻辑写在 app/controller
目录下。
示例代码:
// app/controller/home.js
module.exports = {
index(ctx) {
ctx.body = 'Hello, world!';
},
};
// app/controller/user.js
module.exports = {
list(ctx) {
// 模拟从数据库获取用户列表
const users = [
{ id: 1, name: 'Tom' },
{ id: 2, name: 'Jerry' },
];
ctx.body = users;
},
};
模板引擎与视图
安装模板引擎
Egg.js 支持多种模板引擎,如 Nunjucks、EJS 和 Pug。这里以 Nunjucks 为例,说明如何安装和使用模板引擎。
- 安装 Nunjucks:
npm install nunjucks
-
配置 Nunjucks:
// config/config.default.js module.exports = appInfo => { const config = {}; // 使用 Nunjucks 模板引擎 config.view = { defaultViewEngine: 'nunjucks', mapping: { '.html': 'nunjucks', }, }; return config; };
- 创建模板文件:
在app/view
目录下创建模板文件,如home/index.html
。
示例代码:
<!-- app/view/home/index.html -->
<!DOCTYPE html>
<html>
<head>
<title>Home Page</title>
</head>
<body>
<h1>Welcome to Home Page</h1>
</body>
</html>
使用模板引擎渲染视图
在控制器中使用模板引擎渲染视图。
示例代码:
// app/controller/home.js
module.exports = {
index(ctx) {
// 渲染模板文件并设置返回内容
ctx.body = ctx.render('home/index');
},
};
数据库集成与 ORM
连接数据库
Egg.js 支持多种数据库,如 MySQL、MongoDB 和 PostgreSQL。这里以 MySQL 为例,说明如何连接数据库。
- 安装
egg-mysql
插件:npm install egg-mysql
-
配置数据库连接:
// config/plugin.js exports.mysql = { enable: true, package: 'egg-mysql', }; // config/config.default.js module.exports = appInfo => { const config = {}; // 数据库连接配置 config.mysql = { client: { host: 'localhost', port: 3306, user: 'root', password: 'password', database: 'test', }, app: true, agent: false, }; return config; };
使用 Sequelize 进行 ORM 操作
Sequelize 是一个基于 Promise 的 ORM,支持多种数据库。下面将使用 Sequelize 进行数据库操作。
- 安装
egg-sequelize
插件:npm install egg-sequelize
-
配置 Sequelize:
// config/plugin.js exports.sequelize = { enable: true, package: 'egg-sequelize', }; // config/config.default.js module.exports = appInfo => { const config = {}; // 数据库连接配置 config.sequelize = { dialect: 'mysql', dialectOptions: { charset: 'utf8mb4', }, host: 'localhost', port: 3306, user: 'root', password: 'password', database: 'test', }; return config; };
- 创建模型:
在app/model
目录下创建数据库模型文件。
示例代码:
// app/model/user.js
module.exports = app => {
const { Sequelize, Model } = app;
class User extends Model {}
User.init(
{
id: {
type: Sequelize.INTEGER,
primaryKey: true,
autoIncrement: true,
},
name: {
type: Sequelize.STRING,
allowNull: false,
},
},
{
sequelize: app.sequelize,
tableName: 'users',
timestamps: true,
underscored: true,
}
);
return User;
};
- 使用模型进行数据库操作:
在控制器中使用模型进行数据库操作。
示例代码:
// app/controller/user.js
module.exports = {
list(ctx) {
const { User } = app.model;
User.findAll().then(users => {
ctx.body = users;
});
},
};
模块化开发与中间件使用
Egg.js 的模块化思想
Egg.js 采用了模块化的设计思想,将不同的功能模块化,使得代码更加清晰易于维护。模块化设计允许开发者定义独立的功能模块,这些模块可以被复用和组合,从而提高开发效率和代码质量。
自定义中间件的编写与使用
中间件是 Egg.js 的一个重要特性,它可以处理请求的生命周期中的各个阶段。你可以在 app/middleware
目录下编写自定义中间件。
示例代码:
// app/middleware/logger.js
module.exports = () => {
return function logger(ctx, next) {
console.log(`Request to ${ctx.url} at ${new Date().toLocaleString()}`);
return next().catch(err => {
console.error(`Request to ${ctx.url} failed with error: ${err.message}`);
throw err;
});
};
};
在 app/router.js
中使用自定义中间件:
// app/router.js
const Router = require('koa-router');
const router = new Router();
router.get('/', async (ctx, next) => {
await next();
});
// 使用自定义中间件
router.use('/user', app.middleware.logger());
router.get('/user', async (ctx, next) => {
await next();
});
module.exports = router;
通过以上步骤,你可以创建一个简单的 Egg.js 项目,并了解如何使用 Egg.js 进行路由、模板引擎、数据库集成以及模块化开发。希望这个教程能帮助你快速入门 Egg.js 项目开发。
共同学习,写下你的评论
评论加载中...
作者其他优质文章