NodeJs:如何将非常大的数据从服务器发送到客户端

0md85ypi  于 2022-12-12  发布在  Node.js
关注(0)|答案(1)|浏览(258)

我正在使用Express Framework。我正在尝试从服务器发送非常大的数据。客户端收到200 OK状态,但没有数据。而且,即使我正在从服务器发送内容长度标头,它也会给出错误ERR_CONTENT_LENGTH_MISMATCH。我的响应的内容长度为2102619。
这是我用来发送响应的代码:

var rowNew = JSON.stringify(row); 
res.set({ 'Content-Length': rowNew.length }); 
return res.status(200).send(row);

还试着将时间限制增加到一个非常大的值:

server.timeout = 300000;
jw5wzhpr

jw5wzhpr1#

你的问题的答案需要一些阅读,这里的解决方案
Link to the solution
有一件事你可能还没有充分利用之前是webserver的http响应是一个默认的流。
它们只是让您更容易传入同步数据,这些数据在后台被解析为块并作为HTTP包发送。
我们这里讨论的是巨大的文件;当然,我们不希望将它们存储在任何内存中,至少不希望存储整个blob。
我们在内置节点包'fs'的帮助下创建一个readstream,然后将其传递给stream compatible response.send参数。

const readStream = fs.createReadStream('example.png');
return response.headers({
  'Content-Type': 'image/png',
  'Content-Disposition': 'attachment; filename="example.png"',
}).send(readStream);

我在这里使用了Fastify Web服务器,但它应该与Koa或Express类似。
此处还有两种配置:将标头命名为“内容类型”和“内容处置”。
第一个指示我们逐块发送的blob类型,因此前端将自动为其给予扩展名。
后者告诉浏览器我们发送的是一个附件,而不是可呈现的东西,比如HTML页面或脚本。这将触发浏览器的下载功能,这是广泛支持的。filename参数是内容的下载名称。
我们到了我们实现了最小的内存压力、最少的编码和最小的错误机会。
有一件事我们还没有提到,那就是身份验证。
事实上,前端不会发送 AJAX 请求,我们不能期望请求中出现auth JWT头。
在这里我们将采用良好的老cookie认证方法。基于cookie选项,在每个匹配条件的请求头上自动设置cookie。关于这方面的更多信息,请参见前端实现部分。
默认情况下,cookie以分号分隔的键-值对的形式出现在一个字符串中。为了简化解析部分,我们将使用Fastify的Cookieparser插件。
(cookieParser)中的一个或多个。稍后在handler方法中,我们只需要获取感兴趣的cookie,并将其与期望值进行比较。这应该用某种散列和比较算法来代替。

const cookies = request.cookies;
if (cookies['auth'] !== 'authenticated') {
   throw new APIError(400, 'Unauthorized');
}

就是这样,我们在文件流端点上进行了身份验证,一切都准备就绪,可以通过前端进行连接。

相关问题