Javascript 节点生成进程和存储输出
我的脚本的这一部分正试图生成一个子项,该子项将克隆硬盘驱动器。它基本上可以工作,但我遇到的问题是,当我遇到错误并想要存储输出时,它只存储输出的第一行,不包括我实际需要的东西。我在脚本之外运行了这个命令,它给了我两行输出,如果失败,第二行就是错误。那么,如何存储整个输出呢。非常感谢您的帮助,谢谢Javascript 节点生成进程和存储输出,javascript,node.js,error-handling,ntfs,spawn,Javascript,Node.js,Error Handling,Ntfs,Spawn,我的脚本的这一部分正试图生成一个子项,该子项将克隆硬盘驱动器。它基本上可以工作,但我遇到的问题是,当我遇到错误并想要存储输出时,它只存储输出的第一行,不包括我实际需要的东西。我在脚本之外运行了这个命令,它给了我两行输出,如果失败,第二行就是错误。那么,如何存储整个输出呢。非常感谢您的帮助,谢谢 NtfsPartition.prototype.WriteFs = function(filename, progress, success, error) { console.log('Writ
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();
});
}
为了回答您的问题,我实际上无法测试这一点,但我怀疑删除('data',…)处理程序将允许您确保
err\u msg
是一个Error
对象
还注意到:
注意:'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();
});
}
关键之一是使用属性,因为在默认情况下,当强制为字符串时,错误通常倾向于记录属性。此属性可能是您在代码中得到的单行反馈,因为您从未检查过
err_msg.stack
要回答您的问题,我无法实际测试此属性,但我怀疑删除s.stderr.on('data',…)
处理程序将允许您确保err\u msg
是错误
对象
还注意到:
注意:'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();
});
}
关键之一是使用属性,因为在默认情况下,当强制为字符串时,错误通常倾向于记录属性。此属性可能是您在代码中得到的单行反馈,因为您从未检查过
err\u msg.stack
欢迎使用stack Overflow!这是一个很好的第一个问题,我们期待着您对社区的进一步贡献。我只是添加了一些标记,以使您的问题更容易找到,并且为了将来的参考,您可以使用4个空格缩进大块代码,而不是使用内联倒勾。这些都是非常小的细节,我相信快速访问将教你一些其他的好技巧。欢迎使用堆栈溢出!这是一个很好的第一个问题,我们期待着您对社区的进一步贡献。我只是添加了一些标记,以使您的问题更容易找到,并且为了将来的参考,您可以使用4个空格缩进大块代码,而不是使用内联倒勾。不过这些都是很小的细节,我相信快速浏览一下网站会教你一些其他的好技巧。嗨,是的,移除s.stderr.on就成功了!非常感谢你的帮助。没问题,很高兴我能帮上忙。嗨,是的,s.stderr.on成功了!非常感谢你的帮助。没问题,很高兴我能帮忙