繁体   English   中英

我如何检查是否已通过管道从stdout输入node.js进程?

[英]How do I check if a node.js process is being piped input from stdout?

我目前正在构建一个接受来自python脚本的输入的节点应用程序。 我们计划做这样的管道,例如pyton script.py | node index.js 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}`);
  });
});

我建议您使用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}`);
    });
});

我建议您可以使用一个有趣的npm软件包之一,名为“ python-shell”及其功能,如下所示:

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

这是一个简单的示例:

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
  }
});

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM