• egg 知识点


    • egg 的约定
    约定 使用方法
    路由对应controller中的方法 举例:router.get('/', controller.home.index);,此时对应app/controller/home.js中的index方法
    扩展 Application app/extend/application.js
    扩展 Context app/extend/context.js;middleware 中 this 就是 ctx,例如 this.cookies.get('foo')。
    扩展 Request app/extend/request.js
    扩展 Response app/extend/response.js
    扩展 Helper app/extend/helper.js
    扩展 运行环境 比如,要为开发流程增加集成测试环境 SIT。将 EGG_SERVER_ENV 设置成 sit(并建议设置 NODE_ENV = production),启动时会加载 config/config.sit.js,运行环境变量 app.config.env 会被设置成 sit。官方网址:https://eggjs.org/zh-cn/basics/env.html
    • 一些易混淆点
    易混淆点 说明
    一个常见的错误是把 ctx.request.body 和 ctx.body 混淆,后者其实是 ctx.response.body 的简写
    Router params(url路径中的部分)和 query(url中的参数)的区别 https://eggjs.org/zh-cn/basics/controller.html#queryhttps://eggjs.org/zh-cn/basics/controller.html#router-params
    ctx.validate检验不通过会抛出异常,而app.validator.validate检验不通过会返回错误。你可以自己选择要对这个错误怎么处理,是不管呢还是返回前端。
    • egg 相关库
    库名字 作用
    egg-bin egg 开发工具
    egg-scripts egg 部署工具
    • egg 命令
    命令 作用
    $ npm run dev 进入开发环境
    $ npm run start 启动服务
    $ npm run stop 停止服务
    npm test 执行单元测试
    npm run autod 自动检测依赖更新
    npm run lint 做代码风格检查
    npm run debug 调试;会提示一个debug控制台网址,在浏览器中访问即可,类似:chrome-devtools://devtools/bundled/inspector.html?experiments=true&v8only=true&ws=127.0.0.1:9999/ws_proxy
    npm run cov 测试的覆盖率
    • egg 内置的功能:
    内置 说明
    HttpClient 来方便开发者使用 HTTP 请求。
    static 插件 Egg 内置了 static 插件,线上环境建议部署到 CDN,无需该插件;static 插件默认映射 /public/* -> app/public/* 目录
    单元测试 egg-bin 内置了 mocha、thunk-mocha、power-assert、istanbul 等框架,让你可以专注于写单元测试,无需理会配套工具;断言库非常推荐使用 power-assert
    • 编写扩展
      框架提供了一种快速扩展的方式,只需在 app/extend 目录下提供扩展脚本即可。
    // app/extend/helper.js
    const moment = require('moment');
    exports.relativeTime = time => moment(new Date(time * 1000)).fromNow();
    

    在模板里面使用:

    <!-- app/view/news/list.tpl -->
    {{ helper.relativeTime(item.time) }}
    

    本地开发

    • 环境配置
      本地启动的应用是以 env: local 启动的,读取的配置也是 config.default.js 和 config.local.js 合并的结果。
      测试用例执行时,应用是以 env: unittest 启动的,读取的配置是 config.default.js 和 config.unittest.js 合并的结果。
      运行 npm test 时会自动执行 test 目录下的以 .test.js 结尾的文件(默认 glob 匹配规则 test/**/*.test.js )。
    • 我们在编写用例时往往想单独执行正在编写的用例,可以通过以下方式指定特定用例文件:
    $ TESTS=test/x.test.js npm test
    

    支持 glob 规则。

    • Mocha 支持多种形式的 reporter,默认使用 spec reporter。
      可以手动设置 TEST_REPORTER 环境变量来指定 reporter,例如使用 dot:
    $ TEST_REPORTER=dot npm test
    
    • 指定用例超时时间
      默认执行超时时间为 30 秒。我们也可以手动指定超时时间(单位毫秒),例如设置为 5 秒:
    $ TEST_TIMEOUT=5000 npm test
    
    • 和 test 命令一样,cov 命令执行时,应用也是以 env: unittest 启动的,读取的配置也是 config.default.js 和 config.unittest.js 合并的结果。

    日志输出

    • 使用 logger 模块
      框架内置了日志 功能,使用 logger.debug() 输出调试信息,推荐在应用代码中使用它。
    // controller
    this.logger.debug('current user: %j', this.user);
    
    // service
    this.ctx.logger.debug('debug info from service');
    
    // app/init.js
    app.logger.debug('app init');
    

    通过 config.logger.level 来配置打印到文件的日志级别,通过 config.logger.consoleLevel 配置打印到终端的日志级别。

    • 使用 debug 模块
      debug 模块是 Node.js 社区广泛使用的 debug 工具,很多模块都使用它模块打印调试信息,Egg 社区也广泛采用这一机制打印 debug 信息,推荐在框架和插件开发中使用它。
      我们可以通过 DEBUG 环境变量选择开启指定的调试代码,方便观测执行过程。
      (调试模块和日志模块不要混淆,而且日志模块也有很多功能,这里所说的日志都是调试信息。)
      开启所有模块的日志:
    $ DEBUG=* npm run dev
    

    开启指定模块的日志:

    $ DEBUG=egg* npm run dev
    

    单元测试也可以用 DEBUG=* npm test 来查看测试用例运行的详细日志。

    • 执行 debug 命令时,应用也是以 env: local 启动的,读取的配置是 config.default.js 和 config.local.js 合并的结果。

    • Egg 的定时任务也提供了只让一个 Worker 进程运行的能力,所以能够通过定时任务解决的问题就不要放到 Agent 上执行。

    • 当 Worker 进程异常退出时,Master 进程会重启一个 Worker 进程。

    • 框架会在最外层通过 try catch 统一捕获错误,但是由于 setImmediate 中的代码『跳出』了异步链,它里面的错误就无法被捕捉到了。因此在编写类似代码的时候一定要注意。

    • 为了保证异常可追踪,必须保证所有抛出的异常都是 Error 类型,因为只有 Error 类型才会带上堆栈信息,定位到问题。

    • 框架通过 onerror 插件提供了统一的错误处理机制。对一个请求的所有处理方法(Middleware、Controller、Service)中抛出的任何异常都会被它捕获,并自动根据请求想要获取的类型返回不同类型的错误(基于 Content Negotiation)。

    • 框架并不会将服务端返回的 404 状态当做异常来处理,但是框架提供了当响应为 404 且没有返回 body 时的默认响应。

    • ctx.validate检验不通过会抛出异常,而app.validator.validate检验不通过会返回错误。你可以自己选择要对这个错误怎么处理,是不管呢还是返回前端。

    • 使用中间件

    1. 在应用中使用中间件
    2. 在框架和插件中使用中间件
    3. router 中使用中间件
      前两种方式配置的中间件是全局的,会处理每一次请求。
  • 相关阅读:
    java Vamei快速教程02 方法和数据成员
    java Vamei快速教程01
    二叉树
    高效通信模型之
    高效通信模型之
    线程间通信与同步
    线程
    进程
    C++面试知识点总结
    windows下UDP服务器和客户端的实现
  • 原文地址:https://www.cnblogs.com/cag2050/p/9783727.html
Copyright © 2020-2023  润新知