首页 > 解决方案 > 当父级不关闭管道时如何从标准输入捕获 JSON?

问题描述

我开发了一个名为transpile-md-to-json的包,它将多个 markdown 文件转换为单个 JSON 文件。

运行transpile-md-to-json --src examples/content --watch将 markdown 文件转换为 JSON,并将结果输出到stdoutmarkdown 文件的创建、编辑和删除。

我尝试使用get-stdin捕获 JSON 并使用另一个节点脚本对其进行更多处理。

transpile-md-to-json --src src/privacy-guides --blogify --watch | node test.js

问题永远不会被触发,因为在启用监视模式时stdin.on('end')管道没有关闭( )。transpile-md-to-json--watch

https://github.com/sindresorhus/get-stdin/blob/master/index.js#L23-L25

我该如何解决这个问题?

标签: node.js

解决方案


正如 Mike 在评论中指出的那样,似乎没有内置的方法来实现这一点,因为管道在父级退出之前一直保持打开状态,因此stdin.on('end')不会被触发。

我们能得到的最接近的是使用某种EOF指标并用它来结束一个“循环”。我们可以挂钩的指标并不总是存在,但在 JSON 的上下文中,我们很好,因为每个 JSON 有效负载都以}.

const readline = require("readline")
const fs = require("fs")

process.stdin.setEncoding("utf-8")

const rl = readline.createInterface({
  input: process.stdin,
})
var json = ""
rl.on("line", function(line) {
  json += `${line}\n`
  if (line === "}") {
    console.log("done", json)
    fs.writeFileSync("test.json", json)
    json = ""
  }
})

推荐阅读