2017-07-28 40 views
1

我的脚本的这一部分正在尝试产生一个将克隆硬盘驱动器的孩子。它基本上可行,但我遇到的问题是当我遇到错误并想要存储输出时,它只存储输出的第一行,排除我实际需要的东西。我在脚本之外运行命令,它给了我两行输出,第二行是失败的错误。所以,我怎么能存储整个输出。非常感谢帮助,谢谢!节点产卵过程和存储输出

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

欢迎来到Stack Overflow!这是一个很好的第一个问题,我们期待着您对社区的进一步贡献。我只是添加了一些标签以使您的问题更容易找到,并且为了将来参考,您可以使用4个空格缩进大块代码,而不是使用内联反引号。虽然这些都是非常小的细节,并且我确信快速访问[帮助]会教你一些其他好的提示。 –

回答

0

要回答你的问题,我无法实际测试,但我怀疑,去除s.stderr.on('data', ...)处理程序将允许您以确保err_msgError对象。

还注意到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

+1

嗨,去除s.stderr.on诀窍!感谢您的帮助,非常感谢 – Ian

+0

没问题,很高兴我能帮上忙 –