如何检查node.js进程是否是来自stdout的管道输入?

时间:2017-06-21 01:52:48

标签: node.js bash unix pipe

我目前正在构建一个接受python脚本输入的节点应用程序。我们计划做一个像pyton script.py | node index.js这样的管道。

我想检查是否有输入管道输入。这样如果有数据被管道传输,启动快速服务器。但是,如果没有管道数据退出节点进程。我目前正在检查来自流的输入,但我意识到如果没有来自stdout的输入,我就无法做到这一点。有谁知道更好的解决方案?

这是我到目前为止所拥有的。

import app from "./app";
import { PORT } from "./config";

process.stdin.setEncoding("utf8");

let key = "";
process.stdin.on("data", data => {
  key += data;
});

process.stdin.on("end", () => {
  global.key = key;
  if(global.key === ""){
    console.log("KEY UNDEFINED");
    process.exit(1);
  }
  app.listen(PORT, () => {
    console.log(`Application started on port:${PORT}`);
  });
});

2 个答案:

答案 0 :(得分:0)

我建议您使用get-stdin模块(https://github.com/sindresorhus/get-stdin)。它有一个更好的界面,基于promises。您可以从stdin获取结果,然后启动快速服务器。

getStdin().then(key => {
    if(key === ""){
        console.log("KEY UNDEFINED");
        process.exit(1);
    }
    app.listen(PORT, () => {
        console.log(`Application started on port:${PORT}`);
    });
});

答案 1 :(得分:0)

我建议你可以使用一个名为“python-shell”的有趣的npm包及其功能如下:

  1. 在子进程中可靠地生成Python脚本
  2. 内置文本,JSON和二进制模式
  3. 自定义解析器和格式化程序
  4. 通过stdin和stdout流进行简单有效的数据传输
  5. 抛出错误时的扩展堆栈跟踪。
  6. 这是一个简单的例子:

    var PythonShell = require('python-shell');
    
    PythonShell.run('script.py', function (err,results) {
      //Results : array of messages collected during execution.
      if(err){
         //Error handling
      }
      else if(results.length > 0){
         //Start the server
      }
    });