我脚本的这一部分正在尝试生成一个将要克隆硬盘的子项。它基本上有效,但我遇到的问题是,当我遇到错误并想要存储输出时,它只存储输出的第一行,不包括我实际需要的东西。我在脚本之外运行了命令,它给了我两行输出,如果失败则第二行是错误。那么,我怎么能存储整个输出。非常感谢帮助,谢谢!
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();
});
}
答案 0 :(得分:0)
要回答您的问题,我实际上无法对此进行测试,但我怀疑删除s.stderr.on('data', ...)
处理程序可以确保err_msg
是Error
对象。
另请注意this warning:
注意:发生错误后,
'exit'
事件可能会或可能不会触发。在收听'exit'
和'error'
事件时,重要的是要防止意外地多次调用处理函数。
我可以看到一个可能的解决方案:
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
属性,因为在强制转换为字符串时,错误通常会默认记录message
属性。此属性可能是您在代码中获得的单行反馈,因为您从未检查过err_msg.stack
。