Node.js中的流

什么是流?

说到流,就涉及到一个*nix的概念:管道——在*nix中,流在Shell中被实现为可以通过 |(管道符) 进行桥接的数据,一个进程的输出(stdout)可被直接作为下一个进程的输入(stdin)。

在Node中,流(Stream)的概念与之类似,代表一种数据流可供桥接的能力。

pipe

pipe流式编程的精髓在于 .pipe()方法。可供桥接的能力,在于数据流的两端(上游/下游 或称为 读/写流)以一个 .pipe()方法进行桥接。

伪代码的表现形式为:

流的分类

这里并不打算讨论所谓的Node  v[……]

阅读全文

新春杂记

围绕春节还是发生了一些事情的:年前把工作换了;顺便把烟也给停了;将心态朝着更开放的方向调整中……

新工作很充实,且收获了一位神级队友:勤奋和知识面都值得我学习;一个新世界正在打开……

本质上,我是一个时间利用能力较低的选手,所以,希望能在春季多看点书 🙂

决定暂停吸烟一段时间

缘由:stop-smoking-2-480x475

  1. 最近连续在凌晨3点左右醒来,让我紧张
  2. 不依赖香烟的镇定保持,是一种挑战
  3. 对不理智欲望的控制及镇压,是另一种挑战

从以往经验来说,戒烟这个词太正式了,淡化这个概念更容易成功一些(台阶已留好。

从昨晚到现在,颗烟未进,除了嗜睡比较严重外,零食摄入量也很惊人。与之对应的是,味蕾格外敏感,什么都想尝尝;脑部感到一种整体性的清爽。

最困难时刻还未到来(预祝自己成功。

新年寄语

过去的一年还算充实:

  • 读过书 23 本
  • 听过专辑 192 张
  • 看过电影 156 部
  • 购买了Linode,醉心于各种应用实践和写博客
  • 拥有了智能手环,开始在意睡眠深度和时间
  • 年中的时候用上了VPN,解决我和女友的自由上网问题
  • 背英语单词坚持了333天,还会继续;彻底放弃了语法学习,改用罗塞塔石碑
  • 和基友经营一个Node学习QQ群,在这里认识了很多的码友。其实程序猿这个群体并不像人们所说的乏味,他们是一个个的人,有各自的追求

遗憾也有:

  • 一年没有乐队排练,几乎不练习吉他
  • 一年没有踢过球
  • 一年没有和女友出去游玩

新的一年,希望自己能更专[……]

阅读全文

基于Socket.IO 的私聊

引子

Socket.IO Real-Time Web Application Development最近听到这么一个问题:Socket.IO 怎么实现私聊?换个提法:怎么定位到人(端),或者说怎么标识到连接,而不是依赖每个连接的socket.id。好问题。

在 Socket.IO Real-Time Web Application Development 的指引下,形成了如下思路:

  1. 服务端在每个用户初次进入系统时,产生session_id
  2. 服务端强制用户输入昵称,与session_id对应
  3. 服务端的Socket.IO在连接时,可以拿到socket.request.headers.cookie,从这个cookie中解析出session_id,将socket 连接与[……]

阅读全文

闭包和高阶函数

引子

最近发现一个问题:一部分写JS的人,其实对于函数式编程的概念并不是太了解。如下的代码片断,常常让他们觉得不可思议:

上述片断来自开源项目node-oauth2-server,这个authCodeGrant原型函数涉及到JS编程中经常用到的两个概念:闭包 和 高阶函数(check变量在这个函数中被闭包,authCodeGrant能返回函数,因此是一个高阶函数。

闭包

闭包就是引用了自由变量的函数。这个被引用的自由变量将和这个函数一同存在,即使已经离开了创造它的环境也不例外。

如何来理解这个自由变量呢?

自由变量[……]

阅读全文

Promise,Q及Async

引子

在使用Node/JS编程的时候,经常会遇到这样的问题:有一连串的异步方法,需要按顺序执行,前后结果之间有依赖关系,形如(片断1):

之前也介绍过,这就是著名的回调地狱(Pyramid of Doom)。

Promise

解决回调嵌套及串行状态传送问题,是有规范可循的,如 CommonJS的Promise规范 。

Promise是对异步编程的一种抽象。它是一个代理对象,代表一个必须进行异步处理的函数返回的值或抛出的异常。

以实现较多的 Promise/A(thenable)来说:

  • Promise作为一个[……]

阅读全文

Express的测试覆盖率

引子

有群友问到Express怎么做 单元测试/覆盖率测试,这是上篇所遗漏的,特此补上

Express Web测试

Express Web 测试首先要面对的问题是在哪端进行测试:

  • 客户端的请求响应测试是黑盒,需要预启动站点,且无法附加覆盖率测试
  • 服务端的单元测试需要 Mock ,可附加覆盖率测试

我们需要对Express的路由做覆盖率测试,显然,我们会选择在服务端进行测试。这意味着:每个case需要访问的express application 不是这样预先启动的:

我们需要一个工具能创建启动expre[……]

阅读全文

BDD和Mocha框架

引子

今天造了个轮子:写了个深拷贝任意JavaScript对象的模块(事实上npm上已经有类似的模块,纯造轮子 🙂 虽然是个轮子,依然是需要测试的,保不齐还有除我之外的人会用到。那么问题来了,应该怎么测试?

从需求视角来看,这样的模块涉及到的数据类型繁多(Object/Array/Date/RegExp/Number/String/Function),每一种都需要有不同的测试用例,对于需求方来说,更关注的是模块在每个用例下运行的表现——甚至可以说,这样的模块是以需求为驱动的,即使一开始无法满足所有用例,只要有明确的用例需求,就能够迭代出正确的功能。

有没有这样的测试方法呢?答案[……]

阅读全文

也说this

引子

Any sufficiently advanced technology is indistinguishable from magic.

Arthur C.Clarke

老爷子所言不虚,各种技术里都有黑魔法,比如JavaScript,就有着像 this 这样的奇葩存在。

What’s this?

this是什么?大概能得到的答案有:

  • 当前方法引用的对象实例
  • 当前调用函数本身
  • 全局上下文(顶层对象)
  • 函数运行的context环境

哪种解释是对的呢?来看段代码:

在这段代码中,th[……]

阅读全文