Буфер не распознан как буфер на nodejs с парусами js - PullRequest
0 голосов
/ 05 октября 2018

Я пытаюсь получить буфер из большого двоичного объекта, отправляемого на мой сервер SailsJ.

Пример того, что отправляется на сервер, это:

Blob(3355) {size: 3355, тип: "video / x-matroska; кодеки = avc1, opus"}

Оказавшись на стороне сервера, я делаю следующее:

let body = new Array(0);
let buffer;
let readable = req.file('recordingPart');

readable.on('data', (chunk) => {
  body.push(new Buffer(chunk));
});

readable.on('end', () => {
  buffer = Buffer.concat(body);
  console.log('There will be no more data.', buffer.length, buffer);
});

При выполнении этой части кода я получаю ошибку:

 buffer.js:226
  throw new errors.TypeError(
  ^

TypeError [ERR_INVALID_ARG_TYPE]: The first argument must be one of type string, buffer, arrayBuffer, array, or array-like object. Received type object
    at Function.from (buffer.js:226:9)
    at new Buffer (buffer.js:174:17)
...

В этом случае ошибка происходит при body.push(new Buffer(chunk)); на new Buffer(chunk)

Мой первый подход был похож:

    let body = [];
    let buffer;
    let readable = req.file('recordingPart');

    readable.on('data', (chunk) => {
      body.push(chunk);
    });

    readable.on('end', () => {
      buffer = Buffer.concat(body);
      console.log('There will be no more data.', buffer.length, buffer);
    });

но у меня есть эта ошибка:

    buffer.js:475
      throw kConcatErr;
      ^

TypeError [ERR_INVALID_ARG_TYPE]: The "list" argument must be one of type array, buffer, or uint8Array
    at buffer.js:450:20

В этом случае ошибка появляется на Buffer.concat(body);

Я получил некоторые рекомендации из этого ответа Node.js: Как прочитать поток в буфер?

Может кто-нибудь помочь мне получить buffer из этого req.file.

Ответы [ 2 ]

0 голосов
/ 07 октября 2018

Вы можете получить uploadedFile, как показано ниже.

req.file('recordingPart').upload(function (err, uploadedFiles){

  if (err) return res.serverError(err);

  // Logic with uploadedFiles goes here

});

Вы можете получить дескриптор файла из uploadedFiles[0].fd и использовать его для чтения / потоковой передачи файла, как показано ниже.

fs.readFile(uploadedFiles[0].fd, 'utf8', function (err,data) {

   // Logic with data goes here 
   var myBuffer = Buffer.from(data);
});

Чтобы использовать fs, как указано выше, создайте fs экземпляр, как показано ниже.

var fs = require('fs');
0 голосов
/ 06 октября 2018

Ваш текущий подход к загрузке будет работать, но есть еще один новый способ, который вы могли бы рассмотреть:

// Upload the image.
var info = await sails.uploadOne(photo, {
  maxBytes: 3000000
})
// Note: E_EXCEEDS_UPLOAD_LIMIT is the error code for exceeding
// `maxBytes` for both skipper-disk and skipper-s3.
.intercept('E_EXCEEDS_UPLOAD_LIMIT', 'tooBig')
.intercept((err)=>new Error('The photo upload failed: '+util.inspect(err)));

Полный пример здесь

Также ознакомьтесь с Sails.JS Platzi Course для видеоуроков по этой последней функции загрузки с использованием примера проекта Ration.

...