【问题标题】:nodejs, use oboe to send large stream or large JSON files have some wrongnodejs,使用双簧管发送大流或大JSON文件有一些错误
【发布时间】:2017-11-08 09:00:09
【问题描述】:

我从一台服务器(ex:127.0.0.1:3000)发送一个文件到另一台服务器(ex:127.0.0.1:3001),发现文件太大时,传输会出现问题。

例如:

//127.0.0.1:3000
router.post('/getStream',function(req, res, next){

function getResultStream(){
    return new Promise(function(resolve, reject){
            oboe('http://127.0.0.1:3001/getEnvelopeResult_2')
                .done(function(things) {
                resolve(things);
            }).node(function(e){
                console.log(e);
            })
            .fail(function(e) {
                console.log(e);
                reject(e);
            });

        });
    }

   getResultStream().then(function(body){
       res.json({data:body});
   }).catch(function(err){
       res.json({message:err});
   });


});

例如另一个服务器: 我会得到一个json file.json 并转换成Stream

//127.0.0.1:3001
app.get('/getStream',function(req, res, next){

  let path="json/file.json";

  oboe(fs.createReadStream(path))
  .done(function(things) {

    send(things,res);

   })
   .fail(function(e) {
      res.json({message:e});
   });


  function send(things,res){

    things.errorArray = JSON.parse(things.errorArray);
    let json = JSON.stringify(things);
    highland([
      json
    ])
    .invoke('split', [''])
    .sequence()
    .pipe(res)
  }

});

file.json 大小约为 3000 KB。 内容如下:

{"array":"[{\"No\":1,\"tyep\":\"none\",\"checkflag\":true,\"active\":true,\"time\":\"2017-11-08T07:04:49.024Z\"}...30000 pieces ]
"file":"axzf",
"last":30000,
"start":1
}

这个array为绝大多数容量约30,000。 我试过10,000和20,000和30,000......,失败了。 array 大约只有不到 1100 会被成功传输。

错误信息部分:

{ statusCode: undefined,
  body: undefined,
  jsonBody: undefined,
  thrown:
   Error: Max buffer length exceeded: textNode
   Ln: 1
   Col: 131072
   Chr: undefined
       at Error (native)
       at emitError

at emitOne (events.js:96:13)
       at IncomingMessage.emit (events.js:188:7)
       at readableAddChunk (_stream_readable.js:176:18)
       at IncomingMessage.Readable.push (_stream_readable.js:134:10)
       at HTTPParser.parserOnBody (_http_common.js:123:22)
       at Socket.socketOnData (_http_client.js:363:20)
       at emitOne (events.js:96:13)
       at Socket.emit (events.js:188:7)
       at readableAddChunk (_stream_readable.js:176:18)
       at Socket.Readable.push (_stream_readable.js:134:10)
       at TCP.onread (net.js:547:20) }

 maxActual = Math.max(maxActual, textNode.length);
                                              ^

TypeError: Cannot read property 'length' of undefined
    at checkBufferLength

如果我不能减少信息,我该如何改进,或者我必须通过其他方式做些什么?

高原:http://highlandjs.org/ 双簧管:http://oboejs.com/

【问题讨论】:

    标签: node.js stream oboe.js


    【解决方案1】:

    嘿,我看到这篇文章有点老了,但我遇到了类似的问题,我只能使用 node 来解决这个问题。

    我的目录是为此测试相应设置的:

    .
    ├── s1
    │   └── lorem.txt
    ├── s2
    ├── server.js
    └── transmitter.js
    

    鉴于此,我能够使用以下代码解决此问题:

    transmitter.js

    const http = require('http');
    const fs = require('fs');
    
    const requestOpts = {
      hostname: 'localhost',
      port: 1337,
      method: 'POST'
    };
    
    const readStream = fs.createReadStream('./s1/lorem.txt');
    const request = http.request(requestOpts);
    
    readStream.pipe(request);
    

    server.js

    const http = require('http');
    const fs = require('fs');
    
    http.createServer((request, response) => {
      const writeStream = fs.createWriteStream('./s2/lorem.txt');
    
      request.on('data', (chunk) => {
        writeStream.write(chunk);
      });
    
      request.on('end', () => {
        writeStream.close();
        response.end();
      });
    }).listen(1337);
    

    您可以通过在一个终端窗口中运行 node server.js 并在另一个终端窗口中运行 transmitter.js 来测试这一点。

    结果应该是lorem.txt 出现在s2 目录中,与s1 中出现的完全相同。

    显然,要使这部作品有价值,还有很多工作要做,但希望这有助于下一个人像我一样在这里徘徊。

    【讨论】:

      猜你喜欢
      • 2018-03-24
      • 1970-01-01
      • 2014-09-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-12-06
      相关资源
      最近更新 更多