工具及平台
- express
- 默认不处理body中的信息,通常借助body-parser中间件,若用则在req.body
req.query
http的url中的查询字符?a=b&c=d
组成的对象req.send(body?)
返回一个响应对象,可选参数为响应体
- utility
- 一些常用的工具函数,字符串,数组,加解密,日期,对象,json,web,函数,polyfill
- superagent
- 小型的渐进式客户端和Node.js HTTP请求库,具有许多高级HTTP客户端功能
- 支持链式调用
- request.get().end(cb)
- cheerio
- 快速,灵活和精简的核心jQuery实现,专为服务器而设计,页面解析
- 常用方法
- cheerio.load()
- eventproxy 控制并发
- 适合前后端,能用于浏览器和Node.js
- 将串行等待变成并行等待,提升多异步协作场景下的执行效率
- 异步协作场景
-
多类型异步协作
-
重复异步协作 ep.after(eventname,times,cb),同一事件的多个监听器可合并,但触发还得循环
var ep = new EventProxy(); // 将handle注册到N次相同事件触发上 ep.after('got_file', files.length, function (list) { // 在所有文件的异步执行结束后将被执行 // 所有文件的内容都存在list数组中 }); for (var i = 0; i < files.length; i++) { fs.readFile(files[i], 'utf-8', function (err, content) { // 触发结果事件 ep.emit('got_file', content); }); }
-
持续异步协作
-
- url
- url.resolve(from, to)
- 以一种 Web 浏览器解析超链接的方式把一个目标 URL 解析成相对于一个基础 URL
url.resolve('/one/two/three', 'four'); // '/one/two/four'
- url.resolve(from, to)
- async
- 控制并发连接数,支持在浏览器端使用
- mapLimit(arr, limit, iterator, callback)
- queue(worker,concurrecy)
- mocha 前后端通知测试框架
- describe() 描述测试的主体
- it() 描述具体的case的内容
- 命令mocha
- should,expect 断言库
- should.js在js的Object基类上注入了一个#should属性
- istanbul 测试率覆盖工具
- nyc 一个istanbul命令行接口
- 结合mocha命令
nyc mocha
- chai
- BDD/TDD针对nodejs和浏览器的断言库
- mocha-phantomjs
- 用命令行在phantomjs内运行mocha,进行浏览器测试
mocha-phantomjs index.html --ssl-protocol=any --ignore-ssl-errors=true
- phanatomjs 几乎可以调用所有的浏览器方法
- supertest
- supertest 是 superagent孪生库,集成测试,api
- 边界条件测试,异步测试通常接受函数参数
- nodemon
- 简易监控nodejs开发库,不需要每次启动服务
- benchmark
- 性能测试库,一般是压测,重复性,测试程序性能
- heroku
- 支持多种编程语言的云平台
- travis
- 持续集成平台,可以同一套代码自动跑多平台多版本语言测试
- mongoose
- ODM mongodb面向文档映射数据库操作模块
- q
- 使用promise库,支持CommJS/Promises
原理
- async VS eventpoxy
- 并发连接数控制
- 需要多个源(一般是小于10个)汇总数据时,用eventproxy
- 需要用到队列,需要控制并发数,偏向函数式编程,使用async
- async的本质是一个流程控制
- should 断言库
- 在js的原型对象Object 基类上注入了一个should属性
- 测试驱动开发
- 将达到目的都描述清楚
- 让现有的程序跑不过case
- 修补case,让case通过
- cookie持久化测试两种方案
- 在supertest中,可以通过
var agent = suppertest.agent(app)
可以一路把cookie保存下来 - 在发起请求时调用
.set('Cookie','a cookie string')
形式
- 在supertest中,可以通过
- js闭包
- 使子函数可以访问定义在父层函数中的变量
- 由于返回的函数在其中引用了父层函数的值,父函数的引用计数被+1
- 当返回函数不被垃圾回收时,则父函数也会一直存在
- js中this总指向调用该函数的对象
- 有对象就指向调用对象
- 没调用对象就指向全局对象
- 用new构造就指向新对象,构造器中的this指向新对象
- 通过apply或call或bind来改变this的所指
Note
- 模块导出变量,通常是模块的入口点
- nodejs允许同一事件注册同N次监听器
- nodejs命令行进程process
- process.argv[2]
npm run
所执行的脚本命令是从局部安装的命令开始,然后再去找全局- js中经常使用
typeof
进行类型检查 - 前端测试流程
- 安装mocha命令行工具
- 生成脚手架
mocha init .
- js函数
- js中function对象是有长度的,它的长度是由它的参数决定
- js正则
- 对于四种常用零宽断言,js只支持零宽正预测先行断言和零宽负预测先行断言
- js正则允许表达式后跟以下三个flag
- i 不区分大小写
- g 全局匹配,即匹配多个
- m ^和$可以匹配每一行的开头,多行匹配
\A
字符串开头(类似^,但不受处理多行选项的影响)\Z
字符结尾或行尾(不受处理多行选项的影响)\z
字符串结尾(类似$,但不受多行选项的影响)
- .不能匹配到
\n
- 原子
[\s\S]
能匹配包括\n
在内的所有字符
- 异步执行更类似于万恶的goto语句
- mongoDB
- 表与表之间是没有联系的,也无法支持事务,用来存储非临时性数据
- 用mongodb考量:表 join 到底要不要,事务支持到底要不要。
- 接入Mongodb的模块,使用Mongoose能简化我们对数据库的访问,它通常是nodejs的标配
- 同laravel的orm一样,mogoose的ODM也会将定义的表名,变成复数的表名进行存储
- cookie
- secure值为true时,cookie在http中是无效的,在https中才有效
- httpOnly为true,浏览器不允许脚本操作document.cookie来更改cookie
- path 表示cookie影响到的路径,匹配该路径才发送这个cookie
- session
- 可存在内存,cookie本身,redis或memcached等缓存,数据库中。存数据库中查询效率最低
- 对express-session 默认使用内存来存储session
- session存储在内存中不方便进程间共享,通常使用redis缓存存储session
- 使用redis作为缓存,通常使用connect-redis模块得到redis连接实例,后在session中设置存储方式为该实例
- signedCookie
- 在用户的cookie中存session data,为保证不被更改,用信息摘要算法签名,做个sha1
- promise
- promise的then方法有三个参数,前两个函数对应promise的两种状态fulfilled,rejected。第三个函数用于处理进度信息
- then方法会返回一个promise,promise来替代回调函数的嵌套