#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
Комментариев нет:
Отправить комментарий