簡體   English   中英

nodejs,使用oboe發送大型流或大型JSON文件有一些錯誤

[英]nodejs, use oboe to send large stream or large JSON files have some wrong

我將文件從一台服務器(例如:127.0.0.1:3000)發送到另一台服務器(例如: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 ...,但是失敗了。 只有大約少於1100的array才能成功傳輸。

錯誤信息部分:

{ 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來解決此問題。

為此測試已相應設置了我的目錄:

.
├── s1
│   └── lorem.txt
├── s2
├── server.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出現的完全相同。

顯然,還有很多工作要做,以使該制作值得進行,但希望這可以幫助下一個人像我一樣在這里徘徊。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM