【问题标题】:NodeJS: TypeError: Buffer is not a function (but it's a function!)NodeJS:TypeError:缓冲区不是一个函数(但它是一个函数!)
【发布时间】:2016-04-05 12:22:53
【问题描述】:

对这个有点困惑。我正在使用一个非常典型的 Node+Express 设置,我的许多脚本都在操作 Buffer 对象,它们基本上在任何地方都可以正常工作。除了在一个脚本中,它定义了从 ElasticSearch 数据存储中检索文档的路径。我正在尝试通过解码文件数据的 base64 编码字符串来创建一个新的 Buffer 对象,然后将其发送到浏览器。但是即使在调用new Buffer(fildata,'base64') 之前的console.log 会按照您的预期打印出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)

【问题讨论】:

    标签: javascript node.js express typeerror


    【解决方案1】:

    读取您的控制台输出,require("buffer") 的返回值不是一个函数。相反,它是一个有两种方法的对象:BufferSlowBuffer

    在您的情况下,Buffer 是具有这两种方法的对象。您应该改为使用var Buffer = require('buffer').Buffer;(假设您也不需要SlowBuffer)。

    another answer 中所述,您甚至不需要require("buffer")。它在 Node 中自动作为全局变量使用。

    【讨论】:

    • 天啊!是的,显然我今天早上需要更多的咖啡!谢谢。
    【解决方案2】:

    来自NodeJS documentation

    Buffer 类是一个全局类,因此很少需要 require('buffer')。

    如果我删除 var Buffer = require('buffer') 行,您的代码对我有用。

    看起来当您确实需要缓冲区时,Buffer var 是一个包含 Buffer 构造函数的对象,因此 new Buffer.Buffer(doc["filedata"], 'base64')); 也可以工作。

    【讨论】:

      猜你喜欢
      • 2017-01-17
      • 2019-08-05
      • 1970-01-01
      • 2022-06-13
      • 2020-12-21
      • 2017-11-26
      • 1970-01-01
      • 1970-01-01
      • 2016-07-08
      相关资源
      最近更新 更多