wrong
const spawn = require('child_process').spawn;
var p = spawn('ls');
var stdout = '';
p.stdout.on('data', (data) => {
// if data is incomplete, and you call toString('utf8'), stdout will have a mangled character appended
// doesn't happen often but had to debug
stdout += data.toString('utf8');
});
p.on('close', (code) => {
console.log(stdout);
});
correct
const spawn = require('child_process').spawn;
const { StringDecoder } = require('string_decoder');
var p = spawn('ls');
var decoder = new StringDecoder('utf8');
var stdout = '';
p.stdout.on('data', (data) => {
// this time data is appended to the decoder.
// if the last character of data is incomplete, the decoder wil keep it, and return it on next call.
// therefore stdout is always valid
stdout += decoder.write(data);
});
p.on('close', (code) => {
console.log(stdout);
});