无法存储或发送来自 node.js spawn 的 json 输出

Cannot store or send json output from node.js spawn

我正在尝试使用以下代码来获得所需的 python 输出并存储它,并将结果作为来自 Node.js 的 http 响应发送。这是我的代码

这是pythontest.py文件

import sys

print("Output from Python")
print("First name: " + sys.argv[1])
print("Last name: " + sys.argv[2])

这是Node.js生成方法

testRoute: async(req, res, next) => {

var output="";

var child = spawn('python', [`${process.cwd()}/pyCodes/test.py`,
   'Itachi',
   'Uchiha'
 ]);

child.stdout.setEncoding('utf8');
await child.stdout.on('data', (data) => {
   data = data.toString();
   output += data;
});

 child.stderr.on("data", (data) => {
    data = data.toString();
    output += data;
  });

child.on("error", (error) => {
  error = error.toString();
  output += error;
});

 child.stderr.pipe(process.stderr);

 cosnsole.log('output: ', output) // this shows output as empty
 
child.on("close", (code) => {
   return res.send({
        statusCode: 200,
        status: 'Success',
        data: output, // the output is like this : "Output from Python\r\nFirst name: Itachi\r\nLast name: Uchiha\r\n"
      });
 });
}

但输出仅在控制台/内部 spawn 方法中打印。如果我从外部 spawn 方法访问输出,它显示为空。如何将 python 代码的输出存储在某个变量中?此外,如果我直接在 child.on('close') 中执行 res.send() ,结果字符串包含特殊字符,如 '\r'、'\n' 等......我如何避免这种情况?我什至尝试使用 JSON.parse 但它抛出错误 finding unwanted token at position 0 。如果有人可以让我知道如何在 res.send() 中获得正确的输出,以及如何将输出存储在变量中,即使 JSON?

But the output only prints in console/ insides spawn methods. If I access the output from outside spawn methods it shows empty. How can I store the output from python code in some variable?

你不能。由于 spawn 方法是 运行 异步的。一旦收到关闭事件触发器,它就会打印或播放数据。因此,您的代码必须与行为保持一致。

child.on("close", (code) => {
   console.log("output") 
}

Also if I directly do res.send() inside child.on('close') the resultant string contains special characters like '\r','\n' etc... how can i avoid that

您可以使用正则表达式从最终字符串中删除 special/escape 个字符。 example

child.on("close", (code) => {
   output = output.replace(/\"/g, '"');  //somewhat like regex ?

   return res.send({
        statusCode: 200,
        status: 'Success',
        data: output
      });
 });
}

我不认为有任何这样的方法可以做到这一点。您所能做的就是将您从 spawn 获得的 python 代码的结果传递给另一条路线,或者通过 http 响应 return 将其传递给另一个函数。