Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/33.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js NET连接分块XML数据_Xml_Node.js_Sockets_Soap - Fatal编程技术网

Node.js NET连接分块XML数据

Node.js NET连接分块XML数据,xml,node.js,sockets,soap,Xml,Node.js,Sockets,Soap,我通过节点中的网络套接字接收XML/SOAP。较大的SOAP响应是分块的,因此我需要在将SOAP信封传递给XML解析器之前将其连接起来 以下是迄今为止的尝试 //client.net.setEncoding('utf8'); var data = ''; client.net.on('data', function(response) { var read = response.toString(); console.log("READING == "+read); if

我通过节点中的网络套接字接收XML/SOAP。较大的SOAP响应是分块的,因此我需要在将SOAP信封传递给XML解析器之前将其连接起来

以下是迄今为止的尝试

//client.net.setEncoding('utf8');
var data = '';
client.net.on('data', function(response) {
    var read = response.toString();
    console.log("READING == "+read);
    if (read.substr(read.length-15) === "</env:Envelope>") {
        if(data.length > 0) {
            /* soap envelope is finally complete, pass to xml parser */
            parser.parseString(data += response);
            data = '';
        }
        /* soap envelope is complete, pass to xml parser */
        parser.parseString(response);
    } else {
        /* not soap response */
        if (read.substr(0, 4) === "HTTP") return;
        /* add chunck to data */
        data += response;
    }
});
编辑-进一步信息

这段代码给出了错误,但传递了相同的响应

client.net.on('data', function(response) {
    var read = response.toString();
    if (read.substr(read.length-15) === "</env:Envelope>") {
        parser.parseString(response);
        return;
    }
}
完全错误:

2015-11-13T19:34:50.355Z - error: uncaughtException: Text data outside of root node.
Line: 0
Column: 1228
Char: H date=Fri Nov 13 2015 19:34:50 GMT+0000 (GMT Standard Time), pid=25712, uid=null, gid=null, cwd=C:\Users\v_lowe\Dropbox\nodejs\v4 -of
, execPath=C:\Program Files\nodejs\node.exe, version=v4.1.1, argv=[C:\Program Files\nodejs\node.exe, C:\Users\v_lowe\Dropbox\nodejs\v4 -of\i
ndex.js], rss=44589056, heapTotal=34005760, heapUsed=21471184, loadavg=[0, 0, 0], uptime=954829.8959002, trace=[column=10, file=-of\node_mod
ules\xml2js\node_modules\sax\lib\sax.js, function=error (C:\Users\v_lowe\Dropbox\nodejs\v4, line=666, method=null, native=false, column=7, f
ile=-of\node_modules\xml2js\node_modules\sax\lib\sax.js, function=strictFail (C:\Users\v_lowe\Dropbox\nodejs\v4, line=692, method=null, nati
ve=false, column=15, file=-of\node_modules\xml2js\node_modules\sax\lib\sax.js, function=Object.write (C:\Users\v_lowe\Dropbox\nodejs\v4, lin
e=1035, method=write (C:\Users\v_lowe\Dropbox\nodejs\v4, native=false, column=31, file=-of\node_modules\xml2js\lib\xml2js.js, function=Parse
r.exports.Parser.Parser.parseString (C:\Users\v_lowe\Dropbox\nodejs\v4, line=497, method=exports.Parser.Parser.parseString (C:\Users\v_lowe\
Dropbox\nodejs\v4, native=false, column=59, file=-of\node_modules\xml2js\lib\xml2js.js, function=Parser.parseString (C:\Users\v_lowe\Dropbox
\nodejs\v4, line=7, method=parseString (C:\Users\v_lowe\Dropbox\nodejs\v4, native=false, column=12, file=-of\lib\gps_parse.js, function=Sock
et.<anonymous> (C:\Users\v_lowe\Dropbox\nodejs\v4, line=41, method=<anonymous> (C:\Users\v_lowe\Dropbox\nodejs\v4, native=false, column=13,
file=events.js, function=emitOne, line=77, method=null, native=false, column=7, file=events.js, function=Socket.emit, line=169, method=emit,
 native=false, column=16, file=_stream_readable.js, function=readableAddChunk, line=146, method=null, native=false, column=10, file=_stream_
readable.js, function=Socket.Readable.push, line=110, method=Readable.push, native=false], stack=[Error: Text data outside of root node., Li
ne: 0, Column: 1228, Char: H,     at error (C:\Users\v_lowe\Dropbox\nodejs\v4 -of\node_modules\xml2js\node_modules\sax\lib\sax.js:666:10),
   at strictFail (C:\Users\v_lowe\Dropbox\nodejs\v4 -of\node_modules\xml2js\node_modules\sax\lib\sax.js:692:7),     at Object.write (C:\User
s\v_lowe\Dropbox\nodejs\v4 -of\node_modules\xml2js\node_modules\sax\lib\sax.js:1035:15),     at Parser.exports.Parser.Parser.parseString (C:
\Users\v_lowe\Dropbox\nodejs\v4 -of\node_modules\xml2js\lib\xml2js.js:497:31),     at Parser.parseString (C:\Users\v_lowe\Dropbox\nodejs\v4
-of\node_modules\xml2js\lib\xml2js.js:7:59),     at Socket.<anonymous> (C:\Users\v_lowe\Dropbox\nodejs\v4 -of\lib\gps_parse.js:41:12),     a
t emitOne (events.js:77:13),     at Socket.emit (events.js:169:7),     at readableAddChunk (_stream_readable.js:146:16),     at Socket.Reada
ble.push (_stream_readable.js:110:10)]
2015-11-13T19:34:50.355Z-错误:未捕获异常:根节点外部的文本数据。
行:0
栏目:1228
Char:H date=Fri 2015年11月13日19:34:50 GMT+0000(GMT标准时间),pid=25712,uid=null,gid=null,cwd=C:\Users\v_lowe\Dropbox\nodejs\v4-of
,execPath=C:\Program Files\nodejs\node.exe,版本=v4.1.1,argv=[C:\Program Files\nodejs\node.exe,C:\Users\v\u lowe\Dropbox\nodejs\v4-of\i
ndex.js],rss=44589056,heapTotal=34005760,heapUsed=21471184,loadavg=[0,0,0],正常运行时间=954829.8959002,trace=[column=10,file=-of\node\u mod
ules\xml2js\node\u modules\sax\lib\sax.js,function=error(C:\Users\v\u lowe\Dropbox\nodejs\v4,line=666,method=null,native=false,column=7,f
ile=-of\node\u modules\xml2js\node\u modules\sax\lib\sax.js,function=strictFail(C:\Users\v\u lowe\Dropbox\nodejs\v4,line=692,method=null,nati)
ve=false,column=15,file=-of\node\u modules\xml2js\node\u modules\sax\lib\sax.js,function=Object.write(C:\Users\v\u lowe\Dropbox\nodejs\v4,lin
e=1035,method=write(C:\Users\v\u lowe\Dropbox\nodejs\v4,native=false,column=31,file=-of\node\u modules\xml2js\lib\xml2js.js,function=Parse
r、 exports.Parser.Parser.parseString(C:\Users\v_lowe\Dropbox\nodejs\v4,行=497,方法=exports.Parser.Parser.parseString(C:\Users\v_lowe\
Dropbox\nodejs\v4,native=false,column=59,file=-of\node\u modules\xml2js\lib\xml2js.js,function=Parser.parseString(C:\Users\v\u lowe\Dropbox
\nodejs\v4,line=7,method=parseString(C:\Users\v\u lowe\Dropbox\nodejs\v4,native=false,column=12,file=-of\lib\gps\u parse.js,function=Sock
等。(C:\Users\v\u lowe\Dropbox\nodejs\v4,行=41,方法=(C:\Users\v\u lowe\Dropbox\nodejs\v4,本机=false,列=13,
file=events.js,function=emitOne,line=77,method=null,native=false,column=7,file=events.js,function=Socket.emit,line=169,method=emit,
native=false,column=16,file=\u stream\u readable.js,function=readableAddChunk,line=146,method=null,native=false,column=10,file=\u stream_
readable.js,function=Socket.readable.push,line=110,method=readable.push,native=false],stack=[错误:根节点外的文本数据,Li]
ne:0,列:1228,字符:H,出现错误(C:\Users\v_lowe\Dropbox\nodejs\v4-of\node_modules\xml2js\node_modules\sax\lib\sax.js:666:10),
在strictFail(C:\Users\v\u lowe\Dropbox\nodejs\v4-of\node\u modules\xml2js\node\u modules\sax\lib\sax.js:692:7)和Object.write(C:\User
s\v_lowe\Dropbox\nodejs\v4-of\node_modules\xml2js\node_modules\sax\lib\sax.js:1035:15),位于Parser.exports.Parser.parseString(C:
\Users\v_lowe\Dropbox\nodejs\v4-of\node_modules\xml2js\lib\xml2js.js:497:31),位于Parser.parseString(C:\Users\v_lowe\Dropbox\nodejs\v4
-在Socket(C:\Users\v\u lowe\Dropbox\nodejs\v4-of\lib\gps\u parse.js:41:12)中
t emitOne(events.js:77:13)、Socket.emit(events.js:169:7)、readableAddChunk(_stream_readable.js:146:16)、Socket.Reada
ble.push(_stream_readable.js:110:10)]

一种方法是查找结束模式,而不是使用开始模式,基本上:

  • 每次接收数据时,在缓冲区中累积数据
  • 每次将数据追加到缓冲区时,检查更新的缓冲区中的结束模式
  • 只要在缓冲区中找到结束模式:
    • 从开始到第一个结束模式切掉一段,这是你的框架
    • 继续分析/处理该帧。确保将其从缓冲区中删除
    • 如果缓冲区仍然包含结束模式,则继续截断缓冲区,否则让其增长
就这些

var textBuffer = '';
var parseFrame = function (str){};

function processChunk (chunk) {
  var segments, frame;
  var startChar = String.fromCharCode(1);
  var endChar = String.fromCharCode(0);

  // having no endChar will skip the loop,
  // but we still save the chunk
  textBuffer += chunk;

  while (textBuffer && textBuffer.indexOf(endChar) !== -1) {
    // use endChar in lieu of startChar so we don’t
    // miss a chunk without beginning
    segments = textBuffer.split(endChar);

    // first chunk we extract may or may not have a startChar
    // replace() will have no effect if startChar is absent
    frame = segments.shift().replace(startChar, '');

    // if join() results in '', endChar won’t be found,
    // and we will get out of loop
    textBuffer = segments.join(endChar);

    // beware: it is possible that the frame
    // is incomplete if we *never* got the startChar,
    // the next chunks will be OK though
    try { parseFrame(frame); }
    catch (err) { console.log(err); }
  }
}
client.net.on('data', function(response) {
        parser.parseString(response);
        return;
}
2015-11-13T19:34:50.355Z - error: uncaughtException: Text data outside of root node.
Line: 0
Column: 1228
Char: H date=Fri Nov 13 2015 19:34:50 GMT+0000 (GMT Standard Time), pid=25712, uid=null, gid=null, cwd=C:\Users\v_lowe\Dropbox\nodejs\v4 -of
, execPath=C:\Program Files\nodejs\node.exe, version=v4.1.1, argv=[C:\Program Files\nodejs\node.exe, C:\Users\v_lowe\Dropbox\nodejs\v4 -of\i
ndex.js], rss=44589056, heapTotal=34005760, heapUsed=21471184, loadavg=[0, 0, 0], uptime=954829.8959002, trace=[column=10, file=-of\node_mod
ules\xml2js\node_modules\sax\lib\sax.js, function=error (C:\Users\v_lowe\Dropbox\nodejs\v4, line=666, method=null, native=false, column=7, f
ile=-of\node_modules\xml2js\node_modules\sax\lib\sax.js, function=strictFail (C:\Users\v_lowe\Dropbox\nodejs\v4, line=692, method=null, nati
ve=false, column=15, file=-of\node_modules\xml2js\node_modules\sax\lib\sax.js, function=Object.write (C:\Users\v_lowe\Dropbox\nodejs\v4, lin
e=1035, method=write (C:\Users\v_lowe\Dropbox\nodejs\v4, native=false, column=31, file=-of\node_modules\xml2js\lib\xml2js.js, function=Parse
r.exports.Parser.Parser.parseString (C:\Users\v_lowe\Dropbox\nodejs\v4, line=497, method=exports.Parser.Parser.parseString (C:\Users\v_lowe\
Dropbox\nodejs\v4, native=false, column=59, file=-of\node_modules\xml2js\lib\xml2js.js, function=Parser.parseString (C:\Users\v_lowe\Dropbox
\nodejs\v4, line=7, method=parseString (C:\Users\v_lowe\Dropbox\nodejs\v4, native=false, column=12, file=-of\lib\gps_parse.js, function=Sock
et.<anonymous> (C:\Users\v_lowe\Dropbox\nodejs\v4, line=41, method=<anonymous> (C:\Users\v_lowe\Dropbox\nodejs\v4, native=false, column=13,
file=events.js, function=emitOne, line=77, method=null, native=false, column=7, file=events.js, function=Socket.emit, line=169, method=emit,
 native=false, column=16, file=_stream_readable.js, function=readableAddChunk, line=146, method=null, native=false, column=10, file=_stream_
readable.js, function=Socket.Readable.push, line=110, method=Readable.push, native=false], stack=[Error: Text data outside of root node., Li
ne: 0, Column: 1228, Char: H,     at error (C:\Users\v_lowe\Dropbox\nodejs\v4 -of\node_modules\xml2js\node_modules\sax\lib\sax.js:666:10),
   at strictFail (C:\Users\v_lowe\Dropbox\nodejs\v4 -of\node_modules\xml2js\node_modules\sax\lib\sax.js:692:7),     at Object.write (C:\User
s\v_lowe\Dropbox\nodejs\v4 -of\node_modules\xml2js\node_modules\sax\lib\sax.js:1035:15),     at Parser.exports.Parser.Parser.parseString (C:
\Users\v_lowe\Dropbox\nodejs\v4 -of\node_modules\xml2js\lib\xml2js.js:497:31),     at Parser.parseString (C:\Users\v_lowe\Dropbox\nodejs\v4
-of\node_modules\xml2js\lib\xml2js.js:7:59),     at Socket.<anonymous> (C:\Users\v_lowe\Dropbox\nodejs\v4 -of\lib\gps_parse.js:41:12),     a
t emitOne (events.js:77:13),     at Socket.emit (events.js:169:7),     at readableAddChunk (_stream_readable.js:146:16),     at Socket.Reada
ble.push (_stream_readable.js:110:10)]
var textBuffer = '';
var parseFrame = function (str){};

function processChunk (chunk) {
  var segments, frame;
  var startChar = String.fromCharCode(1);
  var endChar = String.fromCharCode(0);

  // having no endChar will skip the loop,
  // but we still save the chunk
  textBuffer += chunk;

  while (textBuffer && textBuffer.indexOf(endChar) !== -1) {
    // use endChar in lieu of startChar so we don’t
    // miss a chunk without beginning
    segments = textBuffer.split(endChar);

    // first chunk we extract may or may not have a startChar
    // replace() will have no effect if startChar is absent
    frame = segments.shift().replace(startChar, '');

    // if join() results in '', endChar won’t be found,
    // and we will get out of loop
    textBuffer = segments.join(endChar);

    // beware: it is possible that the frame
    // is incomplete if we *never* got the startChar,
    // the next chunks will be OK though
    try { parseFrame(frame); }
    catch (err) { console.log(err); }
  }
}