关于node.js:如何将Buffer作为fs.createReadStream的参数传递

How to pass a Buffer as argument of fs.createReadStream

根据文档
https://nodejs.org/api/fs.html#fs_fs_createreadstream_path_options

fs.createReadStream()可以接受Buffer作为第一个参数

我的节点代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
var _ = require('lodash')
var faker = require('faker')
var http = require('http')
var fs = require('fs')
var xlsx = require('node-xlsx')

var gg = _.range(10).map((item) => {
  return _.range(10).map((item) => {
    return faker.name.findName()
  })
})

http.createServer(function(req, res) {
  var buf = xlsx.build([{
    name: 'sheet1',
    data: gg
  }])
  fs.createReadStream(buf, 'binary').pipe(res)

}).listen(9090)

但是我得到这个错误:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
events.js:160
  throw er; // Unhandled 'error' event
  ^

Error: Path must be a string without null bytes
at nullCheck (fs.js:135:14)
at Object.fs.open (fs.js:627:8)
at ReadStream.open (fs.js:1951:6)
at new ReadStream (fs.js:1938:10)
at Object.fs.createReadStream (fs.js:1885:10)
at Server. (/Users/xpg/project/test/index.js:18:6)
at emitTwo (events.js:106:13)
at Server.emit (events.js:191:7)
at HTTPParser.parserOnIncoming [as onIncoming] (_http_server.js:546:12)
at HTTPParser.parserOnHeadersComplete (_http_common.js:99:23)

enter image description here

我只是想知道,如果要传递Buffer作为path参数,传递" binary"不可用,我应该提供什么选项。

我在Node 6.11.0和Node 8.4.0上都尝试过


fs.createReadStream()的第一个参数必须是文件路径。您显然可以在Buffer对象中传递路径,但是当Buffer转换为字符串时,它仍必须是可接受的OS路径。

似乎您正在尝试将文件内容传递给fs.createReadStream()。那不是API的工作方式。如果查看fs.createReadStream()的代码,则代码中将完全清楚它将调用fs.open()并将fs.createReadStream()中的第一个参数传递为fs.open()的文件路径。

如果您要执行的操作是从缓冲区(不涉及文件)创建可读流,那么您需要以其他方式进行处理。您可以在此处查看操作方法:如何将缓冲区包装为stream2可读流?


@ jfriend00已经对此问题提供了非常清晰的解释。如果将Buffer对象作为参数传递给fs.createReadStream(),则它应指示文件路径,而不是文件内容。正如@Littlee在评论中要求的那样,这是示例代码:

1
2
3
4
5
6
7
8
var express = require('express');
var router = express.Router();
var fs = require('fs')

router.get('/test', function(req, res) {
  var buf = Buffer.from('./test.html');
  fs.createReadStream(buf).pipe(res);
});

请注意,缓冲区buf表示文件路径("./test.html"),而不是文件test.html的内容。