Mercer-Lee的空间

vuePress-theme-reco Mercer-Lee的空间    2018 - 2024
Mercer-Lee的空间 Mercer-Lee的空间

Choose mode

  • dark
  • auto
  • light
TimeLine
分类
  • 数据结构和算法
  • 后端
  • 运维
  • 前端
  • 工具
  • 语言
标签
我的GitHub (opens new window)
author-avatar

Mercer-Lee的空间

27

文章

29

标签

TimeLine
分类
  • 数据结构和算法
  • 后端
  • 运维
  • 前端
  • 工具
  • 语言
标签
我的GitHub (opens new window)
  • Egg框架介绍和应用(二)

    • middleware
      • 插件
        • 智能提示和提示
          • 结语

          Egg框架介绍和应用(二)

          vuePress-theme-reco Mercer-Lee的空间    2018 - 2024

          Egg框架介绍和应用(二)


          Mercer-Lee的空间 2019-10-23 Egg JS Node

          上次的 Egg 分享文章中讲了 app 目录下的 service、controller、router 和 extend,这几个都是 Egg 日常开发最常在里面开发的文件目录,当然 app 目录下还可以建立 schedule 目录然后新增定时任务,不过定时任务是有需要再去了解也不迟的功能,但是接下来分享的是必须要了解的 Egg 的知识点。

          # middleware

          中间件无论在 express 或者 koa 都是最重要的,也是这两个库的最大区分点,Egg 作为 koa 的上层框架,肯定是继承了 koa 的洋葱圈模型。所以 Egg 也是可以像 koa 一样后置全局捕获错误的,这里我们先写一个捕获全局错误的中间件:

          // app/middleware/error_handler.js
          
          "use strict";
          
          module.exports = (option, app) => {
            return async function(ctx, next) {
              try {
                await next();
              } catch (err) {
                // 所有的异常都在 app 上触发一个 error 事件,框架会记录一条错误日志
                app.emit("error", err, this);
                const status = err.status || 500;
                // 生产环境时 500 错误的详细错误内容不返回给客户端,因为可能包含敏感信息
                const error =
                  status === 500 && app.config.env === "prod"
                    ? "Internal Server Error"
                    : err.message;
                // 从 error 对象上读出各个属性,设置到响应中
                ctx.body = {
                  code: status, // 服务端自身的处理逻辑错误(包含框架错误500及自定义业务逻辑错误 ),客户端请求参数导致的错误,设置不同的状态码
                  error: error
                };
                // 创建或者更新对象的时候验证错误
                if (status === 422) {
                  ctx.body.detail = err.errors;
                }
                // 生产环境一律返回200
                ctx.status =
                  status === 500 && app.config.env === "prod" ? 200 : err.status;
              }
            };
          };
          

          然后我们在 config 目录下的 config.default.js 下添加代码:

          // config/config.default.js
          
          "use strict";
          
          module.exports = appInfo => {
            const config = (exports = {});
          
            config.middleware = ["errorHandler"];
          
            return {
              ...config
            };
          };
          

          注意中间件一定要放在 app 文件夹的 middleware 文件夹下,然后直接在 config 的 middleware 数组增加中间件的文件名即可以了。

          # 插件

          插件是 Egg 的一大特色,具体介绍可以官网的介绍 (opens new window)。Egg 的插件大部分是由 Egg 的核心开发人员编写维护的,当然由于基于 koa 的缘故,当你在 Egg 的插件生态 (opens new window)中找不到你想要的插件时,可以去找 koa 的 npm 包,然后安装之后自己稍微封装一下就能使用了。比如我们需要要使用bcrypt插件:

          首先先在项目安装包:

          $ npm i egg-bcrypt --save
          

          然后再配置文件增加:

          // config/config.default.js
          
          "use strict";
          
          module.exports = appInfo => {
            const config = (exports = {});
          
            config.middleware = ["errorHandler"];
          
            config.bcrypt = {
              saltRounds: 10
            };
          
            return {
              ...config
            };
          };
          
          
          // app/config/plugin.js
          
          'use strict';
          
          exports.bcrypt = {
            enable: true,
            package: 'egg-bcrypt'
          }
          
          

          插件的可选配置直接在 config 那里写上就可以了,在 Egg 里面是配置优于代码的。

          # 智能提示和提示

          在Egg框架中提供了智能提示和跳转的功能,如图:

          智能提示和跳转

          详细的介绍可以看语雀的文档 (opens new window)

          # 结语

          Egg的介绍就先到这里,后面我会持续写关于用Egg开发的文章,包括但不限于日常开发要用到的插件、数据库的操作和部署上线。