这个有点困惑。我使用了非常典型的Node + Express设置,我的许多脚本都在操作Buffer对象,这些对象基本上无处不在。除了在一个脚本中,该脚本定义了从ElasticSearch数据存储中检索文档的路径。我试图通过解码base64编码的文件数据字符串来创建一个新的Buffer对象,然后将其发送到浏览器。但即使在调用new Buffer(fildata,'base64')
之前的console.log打印出Buffer函数的描述就像你期望的那样,我得到一个异常" TypeError:Buffer不是功能"
相关代码:
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)
答案 0 :(得分:7)
读取控制台输出,require("buffer")
的返回值是而不是一个函数。相反,它是一个有两种方法的对象:Buffer
和SlowBuffer
。
在您的情况下,Buffer
是具有这两种方法的对象。你应该做var Buffer = require('buffer').Buffer;
(假设你也不需要SlowBuffer
)。
如another answer所述,您甚至不需要require("buffer")
。它在节点中自动作为全局使用。
答案 1 :(得分:4)
Buffer类是全局的,因此很少需要(&#39; buffer&#39;)。
如果删除var Buffer = require('buffer')
行,您的代码就适用于我。
看起来当你需要缓冲区时,Buffer var是一个包含Buffer
构造函数的对象,因此new Buffer.Buffer(doc["filedata"], 'base64'));
也可以工作。