Страницы

Поиск по вопросам

пятница, 24 января 2020 г.

NodeJS Как записать в Buffer полученные данные из busboy?

#javascript #nodejs #файлы #fileupload #filestream


Добрый вечер. 

Использую для получения данных(картинки) busboy. 

Получаю данные так: 

var buffer = Buffer.allocUnsafe(filesize);
req.recvSize = 0;  
 file.on('data', function (data) {
            buffer.write(data,req.recvSize,data.length);
            req.recvSize += data.length;
 });


На выходе такая вот ошибка: 

buffer.js:761
return this.utf8Write(string, offset, length);
^

TypeError: Argument must be a string
at TypeError (native)
at Buffer.write (buffer.js:761:21)


Вариант с concat мне не подходит, так как я изначально знаю размер файла и далее
мне не нужны лишние действия(из-за этого и решил сразу писать в буффер). 

copy тоже не особо хочется использовать, так как все же write записывает данные на
прямую, без лишнего копирования(если вы готовы оспорить это, то буду рад почитать ваше
мнение в комментариях)

Как можно решить такую ошибку или как правильнее будет принимать данные?
    


Ответы

Ответ 1



Не очень понятно по куску кода, что такое file. Скорее всего это ваш request к серверу. Проверьте, не указали ли вы где-то кодировку. Что-то типа res.setEncoding('utf8') В этом случае как раз на событие data у вас придёт объект типа строка, а не Buffer. Но в целом, вы особо не выигрываете, относительно concat массива буферов Buffer.concat(buffers). Потому что в data событие вам уже приходит готовый выделенный объект Buffer, и разницы, когда его копировать - изначально, или в самом конце не очень много. К тому же, несмотря на заявленную длину файла вам фактически может и не приехать столько данных (порвётся соединение, сервер передумает), а вы уже выделили память подо всё это. Кстати, внутри Buffer.concat использует copy, для копирования данных, а не write

Комментариев нет:

Отправить комментарий