Ответ 1
Я не смог воспроизвести ошибку: process.stdout.on('data', callback);//error is thrown at this line
process.stdout.on('data', callback);//error is thrown at this line
. Настолько трудно сказать, почему это ломается для вас. В любом случае process.stdout
является записываемым потоком, поэтому событие data
не поддерживается. С другой стороны childProcess.stdout
является читаемым потоком с родительской точки зрения.
Самый простой способ перехвата stdout дочернего процесса:
const ch = spawn(...)
ch.stdout.on('data', d => ...) // 'd' is a buffer
Если вы хотите протестировать против stdout произвольного процесса всплытия, я боюсь, что вам нужно передать пользовательский записываемый поток в качестве подпроцесса stdout, когда нерест процесса. Поток должен быть основан на дескрипторе файла, поэтому простой Duplex
не будет работать, к сожалению.
Вот возможная настройка:
process.js
const { spawn } = require('child_process')
module.exports = (outStream) => {
console.log('PARENT')
const s = spawn('node', ['${__dirname}/child.js'], { stdio: ['ignore', outStream] })
return () => {
console.log('PARENT-DISPOSE')
s.kill()
}
}
child.js
process.stdout.write('FROM CHILD')
setTimeout(() => process.stdout.write('FROM CHILD END'), 100)
process.spec.js
const { spawn } = require('child_process')
const fs = require('fs')
const process = require('./process.js')
// path to temporary file
const commF = '${__dirname}/comm'
it('test spawn', (done) => {
const w = fs.createWriteStream(commF)
let dispose
w.on('open', () => {
dispose = process(w)
})
// unfortunately I was not able to make fs.createReadStram to read data in real-time
// so here we use another subprocess just for that
let readProcess = spawn('tail', ['-f', commF])
readProcess.stdout.on('data', x => {
const d = x && x.toString()
console.log('TEST', d) // only logs from child are present here
if (d.startsWith('FROM CHILD END')) {
w.close()
fs.unlinkSync(commF)
dispose()
readProcess.kill()
done()
}
})
}).timeout(500)
Не сказать, что это лучший способ сделать это: его можно отвлечь для повторного использования, а tail
зависимость может быть удалена.