nodejs, используйте oboe для отправки большого потока или большие файлы JSON имеют некоторые ошибки
Я отправляю файл с одного сервера (например: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 КБ. содержание как это:
{"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
для подавляющего большинства мощностей около 30000. Я пробовал 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/
1 ответ
Эй, я вижу, что это сообщение немного устарело, но у меня были похожие проблемы, и я смог решить эту проблему только с помощью узла.
Мой каталог настроен соответственно для этого теста:
.
├── 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
,
Очевидно, что еще многое предстоит сделать, чтобы сделать это производство достойным, но, надеюсь, это поможет следующему человеку пройтись здесь, как и я.