node.js - 如何将缓冲区作为 fs.createReadStream 的参数传递

标签 node.js

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

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

我的 Node 代码:

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)

但我收到此错误:
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.<anonymous> (/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 作为路径参数传递,我应该提供哪些选项,传递“二进制”不起作用。

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

最佳答案

fs.createReadStream() 的第一个参数必须是文件路径。您显然可以在 Buffer 对象中传递路径,但是当 Buffer 转换为字符串时,它仍然必须是可接受的操作系统路径。
看来您正试图将文件内容传递给 fs.createReadStream() .这不是该 API 的工作方式。如果您查看 fs.createReadStream() 的代码代码中很清楚它要调用 fs.open()并从 fs.createReadStream() 传递第一个参数作为 fs.open() 的文件路径.
如果您想要做的是从缓冲区(不涉及文件)创建可读流,那么您需要以不同的方式来做。你可以在这个答案中看到如何做到这一点:Converting a Buffer into a ReadableStream in Node.js .
从概念上讲,您只需创建一个可读流对象,将您已有的数据从您的缓冲区中推送到其中,推送一个 null表示流的结束并创建一个 noop _read()方法,你就完成了。然后,您可以将该可读流与任何其他希望读取它的代码一起使用。

关于node.js - 如何将缓冲区作为 fs.createReadStream 的参数传递,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45891242/

相关文章:

node.js - 在 Yeoman-Grunt 构建中安装 npm

javascript - 在 d3.js v4 中以编程方式打开嵌套、折叠(隐藏) Node

javascript - 如何从 websocket url 获取数据?

javascript - 获取 nodejs 函数定义

javascript - TypeError : <class> is not a constructor, 但不同的类工作正常

node.js - 从 redis/index.js 文件捕获连接错误 throw(n)

node.js - 无法在 Node js的 Controller 中获取表单发布数据

node.js - Child_process fork - 间歇性读取错误

javascript - 如何正确处理请求 promise 错误?

javascript - GET 请求适用于 cUrl,但不适用于 axios