使用node.js读取文件并将输出作为HTTP响应expressjs的文件大小限制

Filesize limit in reading files with node.js and serving output as HTTP response expressjs?

本文关键字:expressjs 响应 HTTP 文件大小 读取 js node 文件 输出 使用      更新时间:2023-09-26

我为node.js和expressjs编写了以下代码:

app.get('/api/csv/:filename', function (req, res) {
    var fs = require('fs');
    var csvData = fs.readFileSync("public/uploads/"+req.params.filename, 'utf8');
    res.send(csvData);
});

对于我测试过的100-200MB的小文件(不确定最大/最高大小,它在这个范围内)来说很好。

如果大于300 MB,就会失败。

node.js代码/expressjs返回错误:

#
# Fatal error in ../deps/v8/src/handles.h, line 48
# CHECK(location_ != NULL) failed
#
==== C stack trace ===============================
1: ??
2: ??
3: ??
4: ??
5: ??
6: ??
7: ??
Illegal instruction: 4

我怀疑这是问题与node.js fs.readFileSync()和存储输出在一个变量,而不是expressjs?我目前使用node.js v0.12.4.

我该如何重新编写代码,使其能够通过HTTP返回巨大的文件作为文本字符串?

对于错误消息,我认为它应该返回内存不足之类的东西,遗憾的是相当模糊的输出。

尝试使用Readable stream,并分配一个事件侦听器:

const readable = fs.createReadStream("public/uploads/" + req.params.filename);
readable.on('data', (chunk) => {
  res.write(chunk);
});
readable.on('end', () => {
  res.end();
});

我从来没有真正尝试过,但它应该工作。

直接管道到响应:

var fs = require('fs');
app.get('/api/csv/:filename', function (req, res) {
  var filepath = "public/uploads/"+req.params.filename
  var stream = fs.createReadStream(filepath);
  stream.pipe(res);
});