逐步搭建:初步了解企业级应用代码结构及数据库配置
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.jsconst isJSON = require('koa-is-json');const zlib = require('zlib');async function gzip(ctx, next) {await next();// 后续中间件执行完成后将响应体转换成 gziplet 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');}