2017-08-26 379 views
1

的參數根據文檔 https://nodejs.org/api/fs.html#fs_fs_createreadstream_path_options如何通過一個緩衝區fs.createReadStream

fs.createReadStream()可以接受緩衝液作爲第一個參數

我的節點代碼:

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作爲路徑參數,我應該提供什麼選項,傳遞'binary'不起作用。

我嘗試它與兩個節點6.11.0和節點8.4.0

+0

請參閱https://stackoverflow.com/questions/13230487/converting-a-buffer-into-a-readablestream-in-nodejs – ivo

+0

文件路徑必須最終成爲操作系統將接受的字符串, t是隨機二進制的,所以目前還不清楚你想通過傳遞一個緩衝區來做什麼。如果你傳遞一個緩衝區,它可能會調用'.toString()'。 – jfriend00

+0

@ivo - 這個帖子與'fs.createReadStream()'的第一個參數無關。 – jfriend00

回答

3

的第一個參數fs.createReadStream()必須是文件路徑。你顯然可以在Buffer對象中傳遞路徑,但當Buffer被轉換爲字符串時,它仍然必須是可接受的OS路徑。

看來你正試圖將文件內容傳遞到fs.createReadStream()。這不是那個API的工作原理。如果您查看fs.createReadStream()的代碼,代碼中完全清楚它將調用fs.open()並將fs.createReadStream()的第一個參數作爲fs.open()的文件路徑傳遞。

如果您要做的是從緩衝區創建可讀流(不涉及任何文件),那麼您需要以不同的方式做到這一點。你可以看到如何做到這一點:How to wrap a buffer as a stream2 Readable stream?

1

@ jfriend00已經在這個問題上提供了一個非常明確的解釋。如果Buffer對象作爲參數傳遞給fs.createReadStream(),它應該指示文件路徑,而不是文件內容。作爲@Littlee問評論,下面是一個例子代碼:

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的內容。