Nodejs子进程不会将数据从python脚本返回到stdout

Nodejs子进程不会将数据从python脚本返回到stdout,python,node.js,express,Python,Node.js,Express,我正在编写一个简单的web应用程序来了解节点子进程是如何工作的。基本上,您将名称输入一个有角度的前端,该前端将名称传递给javascript对象中的express后端。后端使用child_进程模块将名称作为参数传递给简单的python脚本,作为命令行参数。前端没有问题,名称成功地传递到后端,但是当我在python进程上调用stdout时,它就不起作用了。没有任何错误消息 这是明确的代码: app.post('/api', (req, res, next) => { console.lo

我正在编写一个简单的web应用程序来了解节点子进程是如何工作的。基本上,您将名称输入一个有角度的前端,该前端将名称传递给javascript对象中的express后端。后端使用child_进程模块将名称作为参数传递给简单的python脚本,作为命令行参数。前端没有问题,名称成功地传递到后端,但是当我在python进程上调用stdout时,它就不起作用了。没有任何错误消息

这是明确的代码:

app.post('/api', (req, res, next) => {
  console.log(req.body.name);

  const spawn = require('child_process').spawn;

  const process = spawn('python3', ['./hello.py', req.body.name]);

  process.stdout.on('data', (data) => {
    console.log(data);
    res.status(200).json({greeting: data});
  });
});
我在代码中放了两个console.log语句来调试它。第一个打印数据,但根本不调用stdout函数中的第二个。python脚本与app.js express文件位于同一文件夹中,因此我非常确定文件路径没有问题

下面是python脚本:

import sys

print('hello' + sys.argv[1])
sys.stdout.flush()

当我在命令行中运行它时,它的工作原理与预期完全相同,但我还是将其包括在内,以防万一。

Process.stdout.on将继续流式处理,直到结束事件。代码是错误的,因为您实际上是在每次stdout中有值时发送响应。您不能多次设置响应标题。试着用下面的方法编写代码。谢谢

 let output;
Process.stdout.on("data", (data) => {
      output += data;
});

Process.on("end", () => {
     // send response here
});

Process.stdout.on将继续流式处理,直到事件结束。代码是错误的,因为您实际上是在每次stdout中有值时发送响应。您不能多次设置响应标题。试着用下面的方法编写代码。谢谢

 let output;
Process.stdout.on("data", (data) => {
      output += data;
});

Process.on("end", () => {
     // send response here
});
关闭将在数据完成时触发

关闭将在数据完成时触发


我真的试过了,但还是不起作用。我试着不用express做同样的事情,效果很好。当我试图用console.log()语句输出数据时,什么也没发生。我连一个错误都没有。我一直在尝试我能想到的语法的每一种变化,我一直得到同样的结果。我真的不知道发生了什么。如果您或其他人能想到任何东西,我会非常感激。您是否尝试过设置python环境变量PYTHONUNBUFFERED=TRUE?我尝试过,但输出不是json格式。。。它是一个字符串,包含特殊字符,如“\r”、“\n”。。。若我不转换成字符串,我会得到这种类型的输出。。{“类型”:“缓冲区”,“数据”:[79、117、116、112、117、116……等等数字]}。你能告诉我如何从res.send()发送json输出吗?我确实试过了,但仍然不起作用。我试着不用express做同样的事情,效果很好。当我试图用console.log()语句输出数据时,什么也没发生。我连一个错误都没有。我一直在尝试我能想到的语法的每一种变化,我一直得到同样的结果。我真的不知道发生了什么。如果您或其他人能想到任何东西,我会非常感激。您是否尝试过设置python环境变量PYTHONUNBUFFERED=TRUE?我尝试过,但输出不是json格式。。。它是一个字符串,包含特殊字符,如“\r”、“\n”。。。若我不转换成字符串,我会得到这种类型的输出。。{“类型”:“缓冲区”,“数据”:[79、117、116、112、117、116……等等数字]}。您能告诉我如何从res.send()发送json输出吗?有一个很好的存储库已经实现了node.js和python之间的接口。以一种非常类似于你的方式。也许它可以作为一个解决方案和灵感的来源:有一个很棒的存储库已经实现了node.js和python之间的接口。以一种非常类似于你的方式。也许它可以作为一个解决方案和您的灵感来源:您应该解释您的解决方案--不同的部分做什么,它与提供的代码OP有何不同,为什么它们的代码和您的代码不起作用?当我们尝试在stdout.on('data')中发送响应时子流程未完成,他们提供了方法关闭,在完成后,我们将所有子流程数据发送到响应中。我的意思是,您的答案中应附带此注释,并提供更详细的信息。您可以编辑您的答案。您应该解释您的解决方案--不同的部分做什么,它与提供的代码OP有何不同,为什么它们的代码和您的代码不起作用?当我们尝试在stdout.on('data')中发送响应时子流程未完成,他们提供了方法关闭,在完成后,我们将所有子流程数据发送到响应中。我的意思是,您的答案中应附带此注释,并提供更详细的信息。你可以编辑你的答案。