【问题标题】:express request Error: socket hangup while parsing large xml快速请求错误:解析大 xml 时套接字挂断
【发布时间】:2025-11-25 10:10:01
【问题描述】:

我试图在worker nodejs应用程序中将一个300MB xml文件解析为json,因此客户端向主Web应用程序发出请求,服务器在worker服务器完成解析后使用文件位置向worker服务器执行请求xml 它将它保存到一个 json 文件并将其位置返回给主服务器。

对于 130MB 以下的 xml 文件一切正常,但是当它遇到一个大文件时,工作服务器完成解析文件并保存它,只要响应到达它接收的主服务器:

 { [Error: socket hang up] code: 'ECONNRESET' }

我尝试在请求选项中使用超时,但它仍然会发生。

request
      .post({
             url:'http://localhost:6666/parsexml',
             formData: {filePath:filePath},
             json: true
      },function(err,httpResponse,jsonResObj){
         // throws error here
      })
  • xml parser worker 向服务器返回 200 消息,然后崩溃。

关于如何实现此功能的任何建议?

【问题讨论】:

    标签: javascript xml node.js express


    【解决方案1】:

    也许您必须使用不同的 XML 解析器,例如 xml-stream,它可以处理大型 (500+ MB) 文件。

    如何安装它

    使用以下命令安装它: npm install -g xml-stream

    如何在您的应用中使用它

    在您的项目中需要它并传递ReadFile 对象来初始化它:

    var fs        = require('fs');
    var XmlStream = require('xml-stream');
    /*
       * Pass the ReadStream object to xml-stream
    */
    var stream=fs.createReadStream('file_name.xml');
    var xml = new XmlStream(stream);
    /*
      *Code continues here
    */
    

    如果您只想从您的 XML 中提取 id 的值并打印它们,这是执行此操作的代码:

    var fs        = require('fs')
    var XmlStream = require('xml-stream') ;
    var stream=fs.createReadStream('some-large-XML.xml');
    var xml = new XmlStream(stream);
    xml.preserve('id', true);
    xml.collect('subitem');
    xml.on('endElement: id', function(item) {
      console.log(item);
    });
    

    更多详细信息可以在here找到。

    【讨论】:

    • 感谢您的回复,我需要创建一个完整的 xml-to-json 转换,不需要任何属性或其他特殊功能。
    • 我目前正在使用:npmjs.com/package/xml2js,它确实工作正常,只有这个问题......(我什至不确定它的解析器错误,因为它完美地创建了 json)
    最近更新 更多