Web 技术研究所

我一直坚信着,Web 将会成为未来应用程序的主流

node 与系统级的流操作

  linux 中本来就有流和管道的概念,我们可以将其和 node 中的流关联起来。通过 process 对象上的 stdin 和 stdout 来访问当前进程的输入输出流。这样就能把流的传递扩展到整个操作系统,让一些简易的进程间交互变简单,而不是像其他特性一样被局限在语言中。
  下面这个程序会接收当前进程的输入流动,并为其中的一些数据加上颜色后再丢给输出流。
#!/usr/bin/env babel-node

import stream from 'stream';

// 中间节点
var t = new stream.Transform;
t._transform = (data, enc, next) => {
  data += '';
  data = data.replace(/\d+(\.\d+){3}/g, '\x1b[33m$&\x1b[0m');
  data = data.replace(/\d+(\.\d+)(?= ms)/g, '\x1b[32m$&\x1b[0m');
  next(null, data);
};

// 将输入流通过 t 节点链接到输出流
process.stdin.pipe(t).pipe(process.stdout);
  我们把 ping 命令通过 linux 的管道语法连接到这个 node 程序上
ping 127.0.0.1 | ./test.js   将得到下面这样带颜色的 ping 输出

  上面的 Transform 实例的 _transform 方法覆写中,可以通过参数提供的 next 方法将数据传给输出流(支持异步)。这个方法的参数列表设计和大多数 node 提供的方法一样,第一个参数为错误,第二个参数才是数据。(我一直觉得这个设计很恶心)
  除了 stdin 和 stdout 之外,还有一个特殊的 stderr,它也可以用于输出,只不过是输出到进程的错误输出流中。这里我就不用 node 演示了。有一些程序就是会利用这个错误输出流来干一些奇奇怪怪的事情,比如 curl 的进度条就是典型。

  以上就是一些基本的系统流概念与 node 的交互介绍。如果使用 node 编写一些系统工具的话可以利用流来处理很多事情。
网名:
174.129.187.*
电子邮箱:
仅用于接收通知
提交 悄悄的告诉你,Ctrl+Enter 可以提交哦
神奇海螺
[查看全部主题]
各类Web技术问题讨论区
发起新主题
本模块采用即时聊天邮件通知的模式
让钛合金F5成为历史吧!
次碳酸钴的技术博客,文章原创,转载请保留原文链接 ^_^