为什么我不能使用Node JS中的subprocess输出响应?

我正在使用Express和试图执行脚本并通过AJAX将该脚本的输出返回到客户端的节点JS。 该脚本正在成功完成,但出于某种原因,我无法得到输出显示在后响应。

let childProcess = require('child_process'); router.post('/update', (req, res) => { childProcess.exec('/home/dir/app/update.sh', { shell: '/bin/bash' }, (error, stdout, stderr) => { res.json({ error, stdout, stderr }); }); }); 

节点进程使用Forever运行。 如果我看看永久日志,它会显示:

永远检测到的脚本被SIGKILL信号杀死

不确定那是什么意思。 看起来脚本正在成功完成。

编辑为了解决艾康的答案在下面。 我尝试了以下,但仍然没有去。

 router.post('/update', (req, res) => { console.log('start...'); childProcess.exec('/home/dir/app/update.sh', { shell: '/bin/bash' }, (error, stdout, stderr) => { console.log('done'); error = error || ''; stdout = stdout || ''; stderr = stderr || ''; res.json({ error, stdout, stderr }); }); }); 

就好像成功函数永远不会启动,因为它永远不会在控制台中logging“完成”。 它只是在控制台中logging了“start …”和上面的SIGKILL错误。

您的脚本可以从subprocess读取输出之前终止(并重新启动)自己的脚本。

再看看你的update.sh

 #!/bin/bash git pull npm install npm run build #this command restarts your script forever restartall 

你可以删除update.sh最后一行,并在发送响应后,脚本刚刚退出, forever应该用更新的版本重新启动它。

 router.post('/update', (req, res) => { childProcess.exec('/home/dir/app/update.sh', { shell: '/bin/bash' }, (error, stdout, stderr) => { res.json({ error, stdout, stderr }); process.exit(); }); }); 
  1. 如果错误不为空,则输出未定义=>失败
  2. stringify错误之后是空的对象。

 'use strict'; let error = new Error('err'); let str = 'text'; let obj = {a: 10, b: 15}; // Try comment to get fall console.log(JSON.stringify({error, str, obj})) 

你的代码中有一个语法错误。 尝试:

 res.json({ error: error, output: stdout, error_log: stderr }); 

或者你可以做:

 res.json([ error, stdout, stderr ]);