JianghuJS-项目结构
120021、jianghujs 目录结构
在JianghuJS中,目录结构沿用 eggjs
的结构规范,结构如下:
├── app
│ ├── common
│ ├── constant
│ │ ├── constant.js
│ │ └── error.js
│ ├── controller
│ ├── public
│ ├── schedule
│ ├── service
│ └── view
├── config
│ ├── config.default.js
│ ├── config.local.js
│ ├── config.prod.js
│ ├── config.unittest.js
│ └── plugin.js
├── app.js
├── jsconfig.json
├── package.json
├── sql
│ └── init.sql
└── upload
2、每一项目录的说明
app
:应用程序的主要代码目录common
:存放项目的常用工具、静态方法等constant
:存放常量定义constant.js
:常量定义文件error.js
:错误信息定义文件
controller
:存放对外暴露的接口的控制器public
:静态资源目录schedule
:存放定时任务service
:存放应用协议的 service 目录view
:存放页面的目录
config
:存放配置文件config.default.js
:默认配置文件config.local.js
:用于 npm run dev 时使用的配置文件config.prod.js
:用于 npm run start 时使用的配置文件config.unittest.js
:用于 npm run test 时使用的配置文件plugin.js
:插件配置文件
app.js
:自定义启动时的初始化工作的入口文件jsconfig.json
:用于配置 JavaScript 项目的语法检查、智能感知等相关设置的文件package.json
:项目的依赖和配置文件sql
:存放 SQL 文件init.sql
:初始化 SQL 文件upload
:上传文件的目录
3、 【jianghujs核心】中间件-链式调用
中间件本质上是一个函数,它可以对请求进行拦截,处理,以及传递给下一个中间件或者路由处理函数。中间件的使用使得我们可以将请求处理流程进行拆分,将处理逻辑进行模块化,便于代码的复用和维护。
在 Egg.js 中,中间件是通过 app
和 ctx
这两个对象进行传递的。在每次请求中,Egg.js 会按照中间件的顺序将 ctx
对象传递给一个个中间件函数,并执行它们的逻辑。在中间件的执行过程中,中间件函数可以根据需要对 ctx
对象进行修改,也可以决定是否将请求传递给下一个中间件或者路由处理函数。这样就可以形成一个链式的请求处理过程,最终得到我们期望的结果。
除了链式调用的核心思想外,Egg.js 中间件还具有以下特点:
- 可以定义多个中间件,形成一个中间件数组。
- 中间件可以通过
app
对象进行注册。 - 中间件的执行顺序可以通过定义中间件的顺序进行控制。
- 中间件可以通过
ctx
对象进行状态共享,便于数据的传递和处理。 - 中间件可以根据需要对请求进行拦截、修改和终止等操作。
我们先来通过编写一个简单的 gzip 中间件,来看看中间件的写法。
// app/middleware/gzip.js
const isJSON = require('koa-is-json');
const zlib = require('zlib');
async function gzip(ctx, next) {
await next();
// 后续中间件执行完成后将响应体转换成 gzip
let body = ctx.body;
if (!body) return;
if (isJSON(body)) body = JSON.stringify(body);
// 设置 gzip body,修正响应头
const stream = zlib.createGzip();
stream.end(body);
ctx.body = stream;
ctx.set('Content-Encoding', 'gzip');
}