【问题标题】:How do I check if a node.js process is being piped input from stdout?如何检查 node.js 进程是否从标准输出通过管道输入?
【发布时间】:2017-06-21 01:52:47
【问题描述】:

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

我想检查是否有输入正在输入。如果有数据正在输入,请启动快速服务器。但是,如果没有通过管道传输的数据,则退出节点进程。我目前正在检查来自流的输入,但我意识到如果没有来自标准输出的输入,我就不能这样做。有人知道更好的解决方案吗?

这是我目前所拥有的。

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

【问题讨论】:

    标签: node.js bash unix pipe


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

      我推荐一个你可以使用的有趣的 npm 包,命名为“python-shell”,它的特性如下:

      1. 在子进程中可靠地生成 Python 脚本
      2. 内置文本、JSON 和二进制模式
      3. 自定义解析器和格式化程序
      4. 通过标准输入和标准输出流进行简单高效的数据传输
      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
        }
      });
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-06-25
        • 2018-12-03
        • 1970-01-01
        • 1970-01-01
        • 2014-07-10
        • 1970-01-01
        • 1970-01-01
        • 2021-02-28
        相关资源
        最近更新 更多