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成功了!非常感谢你的帮助。没问题,很高兴我能帮忙