我看到了如何使用Node将内容管道连接在一起.js流,但是如果其中一些脚本可以是异步的,那么如何使用Unix |将多个脚本管道连接在一起呢?

$ ./a.js | ./b.js

例子:

a.js(chmod 0755)

#!/usr/bin/env node

setTimeout(function(){
  console.log(JSON.stringify({ foo: 'bar' }));
}, 10);

b.js(chmod 0755)

#!/usr/bin/env node

console.log(process.argv);

这是输出:

$ ./a.js | ./b.js
[ 'node', '/Users/viatropos/tests/b.js' ]

events.js:72
        throw er; // Unhandled 'error' event
              ^
Error: write EPIPE
    at errnoException (net.js:883:11)
    at Object.afterWrite (net.js:700:19)

乍一看似乎有很多地方出了问题,所以不确定从哪里开始.有没有办法让它发挥作用?最终目标是能够将./a.jsconsole.log输出用于./b.js.原因是,大多数情况下,这些脚本将一次运行一个,但有时能够将它们连接在一起会很好,因此理想情况下,系统应该能够处理这两种情况.

推荐答案

问题是,你的b.js立即结束并关闭其标准输入,这会在a.js中导致错误,因为它的标准输出被关闭,而你没有处理这种可能性.您有两个选项:在a.js中处理标准输出关闭或在b.js中接受输入.

修正a.js:

process.on("SIGPIPE", process.exit);

如果你加上那一行,当没有人再阅读它的输出时,它就会放弃.在SIGPIPE上可能有更好的事情要做,这取决于你的程序在做什么,但关键是停止console.loging.

修正b.js:

#!/usr/bin/env node

var stdin = process.openStdin();

var data = "";

stdin.on('data', function(chunk) {
  data += chunk;
});

stdin.on('end', function() {
  console.log("DATA:\n" + data + "\nEND DATA");
});

当然,你不需要对这些数据做任何事情.他们的关键是要有一些东西来保持流程的运行;如果你在用管道连接它,stdin.on('data', fx)似乎是一件有用的事情.

记住,其中任何一个都可以防止这种错误.如果您计划在程序之间进行管道连接,我希望第二个选项最有用.

Node.js相关问答推荐

在child_Process中持久运行SSH命令

NodeJS缓冲区大小逻辑:为什么默认是8KB,而不仅仅是数据大小?

在我的Next.js应用程序中没有正确设置Process.env.NODE_ENV

express返回意外的URL

如何在MongoDB中更新嵌套数组

"sh:/usr/local/bin/node:当它存在于文件目录中时未找到

FiRestore UPDATE方法引发错误:&Quot;错误:13内部:收到代码为1&Quot;的RST_STREAM

Nestjs重写子类dto nodejs中的属性

我的 MERN 网站一直告诉我我的一个函数不是一个函数

我正在try 在公共目录中使用 Express.js 项目部署 Angular 静态构建

如何找到特定文档并更新数组中特定键的值?

使用`useLocalStorage`和`useDebounce`时如何解决Next.js中的react-hydration-error

带有事件网格的 Azure 函数在没有 ngrok 的情况下在本地运行

NodeJS 后端发布请求将数据作为NULL值发布到 SQL Server 表

无法通过谷歌Electron 表格 api( node js)中的服务帐户访问写入

node和mongoDB聚合数据时的输入字段函数

我们如何或可以通过 npm 和 Meteor 使用 node 模块?

如何在 Node.js 的 console.log() 中创建换行符

为什么我会收到错误:解决方法指定过多?

为什么数组上的js映射会修改原始数组?