1

我需要从我的 Node.js 脚本中执行一个 shell 命令,读取它的输出并在读取一定数量的字节后终止该程序。(更准确地说,我想通过 进行文件的部分下载smbget)。

我想,最明显的方法是使用childprocess.spawn(), 手动缓冲输出,并kill()在读取足够数据时简单地处理。

这很好用,只是我看起来有点笨拙。所以相反,我想变得聪明(TM)并使用head. 因此,我按照文档中的说明将所有内容连接到child_process(或者,更方便的是,使用procstreams)以生成等效于cat /dev/urandom | head --bytes=10. 唉,一切都像这样燃烧起来:

events.js:72
     throw er; // Unhandled 'error' event
             ^

Error: read ECONNRESET
    at errnoException (net.js:883:11)
    at Pipe.onread (net.js:539:19)

可能是因为head只是将流弄死了,而我找不到捕获或以其他方式处理该错误的方法(尽管这可能只是因为我是节点 n00b :)。

或者,我可以执行以下操作:

var cmd = 'cat /dev/urandom | head --bytes=100';
childprocess.exec(cmd, function (err, stdout, stderr) {
    // ...
});

除了我不能再访问原始(二进制)数据。当我打电话

fs.writeFileSync('foo.dat', stdout);

流将被 utf8 编码,导致文件大约 180 字节而不是预期的 100 字节。

这可以通过将第二个参数传递给来规避exec

{ encoding: 'binary' }

不幸的是,文档说这已被弃用。

这样做的正确方法是什么?还是我绝对需要缓冲自己?

4

1 回答 1

1

从技术上讲,您应该能够将“缓冲区”作为编码传递并让它专门输出一个缓冲区,但看起来情况并非如此。我已经为它开了一张票,应该在 v0.12 发布之前修复。

暂时可以随意使用二进制编码。它只是有点被弃用,但永远不会消失。在 v0.11 中,它受到了一些喜爱,现在是 latin1 编码的代名词。v8 正式支持它,因此支持不会很快消失。

于 2013-07-10T22:38:55.880 回答