【问题标题】:Node spawn process and store output节点生成过程和存储输出
【发布时间】:2017-07-28 18:27:19
【问题描述】:

我的脚本的这一部分试图生成一个要克隆硬盘的子代。它基本上可以工作,但我遇到的问题是,当我遇到错误并想要存储输出时,它只存储输出的第一行,不包括我实际需要的东西。我已经在脚本之外运行了命令,它给了我两行输出,如果失败,第二行是错误。那么,我怎么能存储整个输出。非常感谢您的帮助,谢谢!

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();
    });
}

【问题讨论】:

  • 欢迎来到 Stack Overflow!这是一个很好的第一个问题,我们期待您对社区做出进一步的贡献。我只是添加了一些标签以使您的问题更容易找到,并且为了将来参考,您可以使用 4 个空格缩进大块代码,而不是使用内联反引号。不过,这些都是非常次要的细节,我相信快速访问help center 会教你一些其他不错的技巧。

标签: javascript node.js error-handling ntfs spawn


【解决方案1】:

要回答您的问题,我实际上无法对此进行测试,但我怀疑删除 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

【讨论】:

  • 嗨,是的,删除 s.stderr.on 成功了!非常感谢您的帮助
  • 没问题,很高兴能帮上忙
猜你喜欢
  • 1970-01-01
  • 2017-07-05
  • 1970-01-01
  • 2019-04-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多