构建一个Node应用,它会用到一些node的核心功能,比如模块和流。
Stream非常擅长处理数据,无论是读、写或者是转换。想象一下,你需要把数据从数据库导入到另外一个格式,比如csv。你可以创建一个Stream类,接收从数据库输入的数据,并将它输出到csv的流中,这个新的csv流可以传入一个http请求,这样,这个csv的输出可以直接显示在浏览器上。它还可以接入一个可写的文件流,你甚至可以用这个流来创建一个文件,并发送至浏览器。
在这个例子中,这个Stream类可以接受文本输入,记录通过正则表达式匹配的单词,在文件流发送完后把结果通过一个事件发布出去。你可以用它来记录文件中匹配的单词,也可以把网页内容传入这个流,来记录p标签的数量,这都取决于你,但首先你需要先创建一个新的项目。
你也许在猜专业的Node开发如何创建一个新的项目,因为有npm在,这是个非常简单的过程。虽然你可以创建一个JavaScript文件,并且执行node file.js,我们将使用npm init来创建一个带有package.json文件的新的项目。创建一个新的目录①,cd②进去,然后运行npm init③。
①创建一个新的目录。mkdir first-project
②进入目录中。cd first-project
③创建项目的清单文件。npm init
Node开发者倾向于小模块,在package.json中写明依赖意味着你的项目无论多小,在未来或者其他开发者的机器上是非常容易安装的。
创建一个名为countstream.js的新文件,使用util.inherits来继承stream.Writable并且实现必要的_write方法。一个用于计数的可写流的源码如下:
①继承可写流
②创建一个全局且忽略大小写的正则对象
③把当前的输入数据转化为字符串并进行匹配
④当输入流结束时,触发total事件
在例子中有一个事件,total。这是我们自己创建的——当然你也可以自己创建一个。Streams从EventEmitter继承而来,所以它们都拥有同样的emit和on方法。
当不再有数据时,Node的Writable基类会调用end方法④。该类可以被实例化,并且根据需要来通过管道进行传输数据。