События Axios при загрузке больших файлов с потоками - PullRequest
0 голосов
/ 21 января 2019

Я использую axios на стороне сервера .

Я хочу загрузить большие файлы .. технически это следует использовать с байтовыми диапазонами

  1. Обрабатывает ли axios запрос байтового диапазона, так что функция обратного вызова вызывается только тогда, когда весь ответ готов
  2. Если 1 не соответствует действительности , я должен обработать фрагменты данных сам?

В коде ниже:

axios({
  url: params.url,
  method: 'GET',
  responseType: 'stream' // important
}).then(function (response) {

  logger.debug('__download() : done!')
  let contentType = response.headers['content-type']
  let contentLength = response.headers['content-length']
  var writer = new streams.WritableStream()

  response.data.pipe(writer)
  // ....
})

Должен ли я ждать что-то вроде response.on ('end')?

Цель того, что я делаю, - получить размер буфера (который я могу получить с помощью writer.getBuffer ())

Спасибо за любую подсказку!

1 Ответ

0 голосов
/ 21 января 2019

Я обнаружил, что для загрузки потока, в памяти в моем случае, мне пришлось ждать события на моем устройстве записи (writer.on ('done', cb) vs response.on ('end', cb)) (не уверен, есть ли что-то вроде response.on ('end')) ...

var stream = require('stream');
var util = require('util');
var Writable = stream.Writable;


function MemoryStream(options) {
    if (!(this instanceof MemoryStream)) {
        return new MemoryStream(options);
    }
    Writable.call(this, options); // init super
}
util.inherits(MemoryStream, Writable);

MemoryStream.prototype._write = function (chunk, enc, cb) {
    var buffer = (Buffer.isBuffer(chunk)) ?
        chunk :
        Buffer.alloc(chunk, enc);

    if (Buffer.isBuffer(this.memStore)) {
        this.memStore = Buffer.concat([this.memStore, buffer]);
    } else {
        this.memStore = buffer
    }
    cb();
};


MemoryStream.prototype.toBuffer = function () {
    return this.memStore
};




module.exports = MemoryStream

, а затем в моей функции загрузки:

axios({
  url: params.url,
  method: 'GET',
  responseType: 'stream' // important
}).then(function (response) {

  logger.debug('__download() : done!')
  let contentType = response.headers['content-type']
  let contentLength = response.headers['content-length']
  var writer = new MemoryStream()

  response.data.pipe(writer)

    writer.on('finish', function () {

        var b = writer.toBuffer()

        let computedContentLength = b.byteLength

        if (!contentLength) { contentLength = computedContentLength }

        return callback(null, { 'foo':'bar'})

    });
})
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...