节点生成过程和存储输出
Node spawn process and store output
我的这部分脚本试图生成一个要克隆硬盘的子进程。它基本上可以工作,但我遇到的问题是当我遇到错误并想要存储输出时,它只存储输出的第一行,不包括我实际需要的东西。我在脚本之外有 运行 命令,它给了我两行输出,第二行是失败时的错误。那么,我该如何存储整个输出。非常感谢您的帮助,谢谢!
NtfsPartition.prototype.WriteFs = function(filename, progress, success, error) {
console.log('Writing NTFS FS');
var s = spawn("ntfsclone", ['--restore-image', '--overwrite', this.dev, filename]);
var err_msg = '';
s.on('error', function(err) {
err_msg = err;
});
s.stderr.on('data', function(data) {
err_msg += data.toString();
});
s.stdout.on('data', function(data) {
var match = data.toString().match(kNtfsWriteFsProgressRegex);
if(!match) {
return;
}
progress(match[1]);
});
s.on('exit', function(code) {
if(code != 0) {
console.log(err_msg);
return error('Error: ' + code + ' - ' + err_msg);
}
success();
});
}
为了回答您的问题,我实际上无法对此进行测试,但我怀疑删除 s.stderr.on('data', ...)
处理程序将使您能够确保 err_msg
是一个 Error
对象。
同时注意到 this warning:
Note: The 'exit'
event may or may not fire after an error has occurred. When listening to both the 'exit'
and 'error'
events, it is important to guard against accidentally invoking handler functions multiple times.
我可以看到一个可能的解决方案,如下所示:
NtfsPartition.prototype.WriteFs = function(filename, progress, success, error) {
console.log('Writing NTFS FS');
var s = spawn("ntfsclone", ['--restore-image', '--overwrite', this.dev, filename]);
var errors = [];
// if possible, might get multiple of these
// if not, this still works for a single error
s.on('error', function(err) {
errors.push(err)
});
s.stdout.on('data', function(data) {
var match = data.toString().match(kNtfsWriteFsProgressRegex);
if(!match) {
return;
}
progress(match[1]);
});
// guaranteed to be called, whereas 'exit' is not(?)
s.on('close', function(code) {
if(code != 0) {
var stacks = errors.map(function (err) {
return err.stack;
});
// all the errors
return error('Error: ' + code + '\n\n' + stacks.join('\n\n'))
}
success();
});
}
其中一个关键是在强制转换为字符串时默认使用 error.stack
property, since errors typically tend to log the message
属性。这 属性 可能是您在代码中获得的单行反馈,因为您从未检查过 err_msg.stack
.
我的这部分脚本试图生成一个要克隆硬盘的子进程。它基本上可以工作,但我遇到的问题是当我遇到错误并想要存储输出时,它只存储输出的第一行,不包括我实际需要的东西。我在脚本之外有 运行 命令,它给了我两行输出,第二行是失败时的错误。那么,我该如何存储整个输出。非常感谢您的帮助,谢谢!
NtfsPartition.prototype.WriteFs = function(filename, progress, success, error) {
console.log('Writing NTFS FS');
var s = spawn("ntfsclone", ['--restore-image', '--overwrite', this.dev, filename]);
var err_msg = '';
s.on('error', function(err) {
err_msg = err;
});
s.stderr.on('data', function(data) {
err_msg += data.toString();
});
s.stdout.on('data', function(data) {
var match = data.toString().match(kNtfsWriteFsProgressRegex);
if(!match) {
return;
}
progress(match[1]);
});
s.on('exit', function(code) {
if(code != 0) {
console.log(err_msg);
return error('Error: ' + code + ' - ' + err_msg);
}
success();
});
}
为了回答您的问题,我实际上无法对此进行测试,但我怀疑删除 s.stderr.on('data', ...)
处理程序将使您能够确保 err_msg
是一个 Error
对象。
同时注意到 this warning:
Note: The
'exit'
event may or may not fire after an error has occurred. When listening to both the'exit'
and'error'
events, it is important to guard against accidentally invoking handler functions multiple times.
我可以看到一个可能的解决方案,如下所示:
NtfsPartition.prototype.WriteFs = function(filename, progress, success, error) {
console.log('Writing NTFS FS');
var s = spawn("ntfsclone", ['--restore-image', '--overwrite', this.dev, filename]);
var errors = [];
// if possible, might get multiple of these
// if not, this still works for a single error
s.on('error', function(err) {
errors.push(err)
});
s.stdout.on('data', function(data) {
var match = data.toString().match(kNtfsWriteFsProgressRegex);
if(!match) {
return;
}
progress(match[1]);
});
// guaranteed to be called, whereas 'exit' is not(?)
s.on('close', function(code) {
if(code != 0) {
var stacks = errors.map(function (err) {
return err.stack;
});
// all the errors
return error('Error: ' + code + '\n\n' + stacks.join('\n\n'))
}
success();
});
}
其中一个关键是在强制转换为字符串时默认使用 error.stack
property, since errors typically tend to log the message
属性。这 属性 可能是您在代码中获得的单行反馈,因为您从未检查过 err_msg.stack
.