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#query ,https://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检验不通过会返回错误。你可以自己选择要对这个错误怎么处理,是不管呢还是返回前端。
使用中间件
- 在应用中使用中间件
- 在框架和插件中使用中间件
- router 中使用中间件
前两种方式配置的中间件是全局的,会处理每一次请求。
egg 知识点的更多相关文章
- Egg入门学习(二)---理解service作用
在上一篇文章 Egg入门学习一 中,我们简单的了解了Egg是什么东西,且能做什么,这篇文章我们首先来看看官网对Egg的整个框架的约定如下,及约定对应的目录是做什么的,来有个简单的理解,注意:我也是按照 ...
- Golang 数组 切片 字典 基本知识点
数组 数组的声明 var arrayName [arraySize]dataType eg: var array1 [5]int 在声明数组时,必须指定数组名,数组长度和数组元素的类型. 数组的初始化 ...
- ASP.NET Core 中的那些认证中间件及一些重要知识点
前言 在读这篇文章之间,建议先看一下我的 ASP.NET Core 之 Identity 入门系列(一,二,三)奠定一下基础. 有关于 Authentication 的知识太广,所以本篇介绍几个在 A ...
- ASP.NET MVC开发:Web项目开发必备知识点
最近加班加点完成一个Web项目,使用Asp.net MVC开发.很久以前接触的Asp.net开发还是Aspx形式,什么Razor引擎,什么MVC还是这次开发才明白,可以算是新手. 对新手而言,那进行A ...
- UWP开发必备以及常用知识点总结
一直在学UWP,一直在写Code,自己到达了什么水平?还有多少东西需要学习才能独挡一面?我想对刚接触UWP的开发者都有这种困惑,偶尔停下来总结分析一下还是很有收获的! 以下内容是自己开发中经常遇到的一 ...
- C#高级知识点&(ABP框架理论学习高级篇)——白金版
前言摘要 很早以前就有要写ABP高级系列教程的计划了,但是迟迟到现在这个高级理论系列才和大家见面.其实这篇博客很早就着手写了,只是楼主一直写写停停.看看下图,就知道这篇博客的生产日期了,谁知它的出厂日 ...
- lucene 基础知识点
部分知识点的梳理,参考<lucene实战>及网络资料 1.基本概念 lucence 可以认为分为两大组件: 1)索引组件 a.内容获取:即将原始的内容材料,可以是数据库.网站(爬虫).文本 ...
- DoraCMS 源码知识点备注
项目需要研究了下DoraCMS这款开源CMS,真心做的不错:).用的框架是常用的express 4 + mongoose,代码也很规范,值得学习. 源码中一些涉及到的小知识点备注下: https:// ...
- atitit 商业项目常用模块技术知识点 v3 qc29
atitit 商业项目常用模块技术知识点 v3 qc29 条码二维码barcodebarcode 条码二维码qrcodeqrcode 条码二维码dm码生成与识别 条码二维码pdf147码 条码二维码z ...
随机推荐
- Kubernetes资源监控探索
搭建kubernetes集群,有一个默认的dashboard,但是这个dashboard比较简陋,不能将自定义展示.所以打算使用Grafana+Heapster+Influxdb构建一个一体化监控平台 ...
- Java语法基础学习DayNine(Java集合)
一.Java集合 1.概述 一方面,面向对象语言对事物的体现都是以对象的形式,为了方便对多个对象的操作,就需要对对象进行存储.另一方面,使用Array存储对象具有一些弊端,而Java集合就像一种容器, ...
- java基础语法学习DayOne
一.关键字 1.概述:被java语言赋予特定含义的单词 2.特点:组成关键字的字母全部为小写 二.标识符 1.概述:给类.接口.方法.变量起名字时使用的字符序列 2.规则:只能使用英文大小写字母.数字 ...
- Html.DropDownList()的用法
页面代码如下: <%= Html.DropDownList("Category", ViewData["Categories"] as SelectLis ...
- os.path和sys.path的区别
os.path是module,包含了各种处理长文件名(路径名)的函数. sys.path是由目录名构成的列表,python从中查找扩展模块(python源模块)编译模块,或者二进制扩展),启动pyth ...
- Makefile内置变量,递归式变量,直接展开式变量,条件赋值,追加赋值
将shell命令的输出赋值给变量: VALUE = $(shell 命令) Makefile中给变量赋值: = 是递归展开式变量 value1 = 5 value2 = $(value1) ...
- 20165228 2017-2018-2 《Java程序设计》第1周学习总结
20165228 2017-2018-2 <Java程序设计>第1周学习总结 教材学习内容总结 JAVA程序的组成:多个书写独立的类组成,class后为类名,类名后的{ }里为类体 JAV ...
- LINUX添加磁盘
博客网站原因,图片不能很好插入,望谅解 第一步:设置加载硬盘.由于是虚拟硬盘大小,不会一开始直接占用全部空间,使用多少占用多少,为了避免后期磁盘满前期设计大容量 第二步加载查看磁盘: 再执行fdisk ...
- 九度OJ1108-堆栈的使用
题目1108:堆栈的使用 时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:11620 解决:3372 题目描述: 堆栈是一种基本的数据结构.堆栈具有两种基本操作方式,push 和 pop.P ...
- quartz定时任务及时间设置
quartz 定时任务时间设置1.这些星号由左到右按顺序代表 : * * * * * * * ...