Nano Hash - криптовалюты, майнинг, программирование

NodeJS: TypeError: Buffer не является функцией (но это функция!)

Немного сбит с толку этим. Я использую довольно типичную настройку Node+Express, и многие из моих скриптов манипулируют объектами Buffer, которые отлично работают практически везде. За исключением одного скрипта, который определяет маршрут для получения документа из хранилища данных ElasticSearch. Я пытаюсь создать новый объект Buffer, декодируя строку данных файла в кодировке base64, а затем отправляя ее в браузер. Но даже несмотря на то, что console.log непосредственно перед вызовом new Buffer(fildata,'base64') выводит описание функции Buffer, как и следовало ожидать, я получаю исключение «TypeError: Buffer is not a function».

Соответствующий код:

var Buffer = require('buffer');
// ... then in the route, inside the callback from the ElasticSearch get() method:
res.setHeader('Content-Type', doc["mimetype"]);
res.setHeader('Content-disposition', 'attachment; filename=' + doc["filename"]);
res.type(doc["mimetype"]);
console.log(Buffer); // Yep, definitely a function here!
res.send(new Buffer(doc["filedata"], 'base64'));

И вывод узла (обратите внимание на вывод console.log непосредственно перед тем, как будет выдано исключение):

{ Buffer:
   { [Function: Buffer]
     poolSize: 8192,
     isBuffer: [Function: isBuffer],
     compare: [Function: compare],
     isEncoding: [Function],
     concat: [Function],
     byteLength: [Function: byteLength] },
  SlowBuffer: [Function: SlowBuffer],
  INSPECT_MAX_BYTES: 50,
  kMaxLength: 2147483647 }
/Users/myusername/mynodeproject/routes/retrieve.js:50
                    res.send(new Buffer(doc["filedata"], 'base64'));
                             ^

TypeError: Buffer is not a function
    at /Users/myusername/mynodeproject/routes/retrieve.js:50:15
    at respond (/Users/myusername/mynodeproject/node_modules/elasticsearch/src/lib/transport.js:301:9)
    at checkRespForFailure (/Users/myusername/mynodeproject/node_modules/elasticsearch/src/lib/transport.js:239:7)
    at HttpConnector.<anonymous> (/Users/myusername/mynodeproject/node_modules/elasticsearch/src/lib/connectors/http.js:155:7)
    at IncomingMessage.wrapper (/Users/myusername/mynodeproject/node_modules/lodash/index.js:3095:19)
    at emitNone (events.js:72:20)
    at IncomingMessage.emit (events.js:166:7)
    at endReadableNT (_stream_readable.js:905:12)
    at doNTCallback2 (node.js:452:9)
    at process._tickCallback (node.js:366:17)

Ответы:


1

Судя по выводу вашей консоли, возвращаемое значение require("buffer") не является функцией. Вместо этого это объект с двумя методами: Buffer и SlowBuffer.

В вашем случае Buffer - это тот объект с этими двумя методами. Вместо этого вы должны сделать var Buffer = require('buffer').Buffer; (при условии, что вам также не нужно SlowBuffer).

Как отмечено в другом ответе, вам даже не нужно require("buffer"). Он автоматически доступен как глобальный в Node.

31.12.2015
  • О! Да, видимо, сегодня утром мне нужно гораздо больше кофе! Спасибо. 31.12.2015

  • 2

    Из документации NodeJS:

    Класс Buffer является глобальным, что делает его очень редким, когда требуется ('buffer').

    Ваш код работает для меня, если я удалю строку var Buffer = require('buffer').

    Похоже, когда вам требуется буфер, переменная Buffer является объектом, содержащим конструктор Buffer, так что new Buffer.Buffer(doc["filedata"], 'base64')); также работает.

    31.12.2015
    Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..