逐步搭建:初步了解企业级应用代码结构及数据库配置

12002

1、jianghujs 目录结构

在JianghuJS中,目录结构沿用 eggjs 的结构规范,结构如下:

  1. ├── app
  2. ├── common
  3. ├── constant
  4. ├── constant.js
  5. └── error.js
  6. ├── controller
  7. ├── public
  8. ├── schedule
  9. ├── service
  10. └── view
  11. ├── config
  12. ├── config.default.js
  13. ├── config.local.js
  14. ├── config.prod.js
  15. ├── config.unittest.js
  16. └── plugin.js
  17. ├── app.js
  18. ├── jsconfig.json
  19. ├── package.json
  20. ├── sql
  21. └── init.sql
  22. └── 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 中,中间件是通过 appctx 这两个对象进行传递的。在每次请求中,Egg.js 会按照中间件的顺序将 ctx 对象传递给一个个中间件函数,并执行它们的逻辑。在中间件的执行过程中,中间件函数可以根据需要对 ctx 对象进行修改,也可以决定是否将请求传递给下一个中间件或者路由处理函数。这样就可以形成一个链式的请求处理过程,最终得到我们期望的结果。

除了链式调用的核心思想外,Egg.js 中间件还具有以下特点:

  • 可以定义多个中间件,形成一个中间件数组。
  • 中间件可以通过 app 对象进行注册。
  • 中间件的执行顺序可以通过定义中间件的顺序进行控制。
  • 中间件可以通过 ctx 对象进行状态共享,便于数据的传递和处理。
  • 中间件可以根据需要对请求进行拦截、修改和终止等操作。

我们先来通过编写一个简单的 gzip 中间件,来看看中间件的写法。

  1. // app/middleware/gzip.js
  2. const isJSON = require('koa-is-json');
  3. const zlib = require('zlib');
  4. async function gzip(ctx, next) {
  5. await next();
  6. // 后续中间件执行完成后将响应体转换成 gzip
  7. let body = ctx.body;
  8. if (!body) return;
  9. if (isJSON(body)) body = JSON.stringify(body);
  10. // 设置 gzip body,修正响应头
  11. const stream = zlib.createGzip();
  12. stream.end(body);
  13. ctx.body = stream;
  14. ctx.set('Content-Encoding', 'gzip');
  15. }