Nodejs流学习系列之四: Nodejs流的应用例子

林光

前言

理论花了三篇文章,也算是基本讲完了Nodejs流的一些基础知识,理论是给实践服务的,我们这篇文章也就没有那么多知识了,通过两个小应用来解决我在实际项目中遇到的两个问题。实际情况当然比这里的demo复杂,这里是我简化过的,所以大家清楚解决思路即可,无须纠结内在的一些细节哈。

问题一

在平时的Nodejs应用中,我们也许需要去处理文件的内容,有时候甚至需要分析文件内容,然后保留相关信息输出给用户看。因此假设我们有这么一个文件,里面的内容是每行都有不定数目的随机字母,我们需要统计每一行的每个字母的个数,然后输出这么一个对象: { line: 1, statistics: [ { letter: 'd', length: 6 }, { letter: 'f', length: 10 }, { letter: 'j', length: 2 }, { letter: 'n', length: 2 }, { letter: 'o', length: 4 }, { letter: 's', length: 8 } ] .... }

该问题没有看答案之前大家可以自己想想如何实现。对应的实现代码可以参考下面的链接:

application1.js

实现原理:

此题除了利用了Transform流之外还用了下面这些代码:

const firstStep = chunk.match(/[a-zA-Z]/g).sort().join('').match(/(\w)\1+/g)  
// 这样得到的结果应该是诸如这样的: ['aaaaa','bbb','ccc'.....]
// 这样就很容易统计每个字母出现的个数了!
return firstStep.map(item => {  
  const res = { letter: item[0], length: item.length }
  return res
})

其中设计到的一个正则表达式可以拿出来说一下。

/(\w)\1+/g的用法叫做分组反向引用(Grouping and back references),其中: 1. (\x)是用于匹配然后记住这个匹配,这种做法叫做捕获组。捕获组根据左括号的顺序开始编号,从1开始,匹配到的字符串都可以在结果数组中直接使用下标引用到,或者从预定义的RegExp对象的属性$1,.....$9。
2. \n:当n是一个正数,那么反向引用的是匹配到第n个捕获组
3. +: 匹配1次或者更多次,等价于{1,}

更多关于反向引用的可以参考别的文档。

问题二

这个问题也是在实际项目中遇到的,解析CSV文件。实际上网上已经有类似的包,但是我们现在想要自己手动实现一个解析器。这次我们将借助于两个包: through2split2

关于这两个包的介绍可以参考: nodejs-useful-packages

相关代码在: application2

总结

Nodejs流的学习零零散散地学了将近一个月了,官方文档前前后后读了估计有四五遍。可以说这是目前我学习nodejs最长的一个模块,当然其他模块还没开始,以前都是随随便便当做手册查询,没有深入到代码逻辑,也没有详细地深入文档。以后以此为开头,深入地学习Nodejs,将更多的干货贡献给大家。

参考

  1. 正则表达式
  2. The Definitive Guide to Object Streams in Node.js