我正在使用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;
1条答案
按热度按时间jw5wzhpr1#
你的问题的答案需要一些阅读,这里的解决方案
Link to the solution
有一件事你可能还没有充分利用之前是webserver的http响应是一个默认的流。
它们只是让您更容易传入同步数据,这些数据在后台被解析为块并作为HTTP包发送。
我们这里讨论的是巨大的文件;当然,我们不希望将它们存储在任何内存中,至少不希望存储整个blob。
我们在内置节点包'fs'的帮助下创建一个readstream,然后将其传递给stream compatible response.send参数。
我在这里使用了Fastify Web服务器,但它应该与Koa或Express类似。
此处还有两种配置:将标头命名为“内容类型”和“内容处置”。
第一个指示我们逐块发送的blob类型,因此前端将自动为其给予扩展名。
后者告诉浏览器我们发送的是一个附件,而不是可呈现的东西,比如HTML页面或脚本。这将触发浏览器的下载功能,这是广泛支持的。filename参数是内容的下载名称。
我们到了我们实现了最小的内存压力、最少的编码和最小的错误机会。
有一件事我们还没有提到,那就是身份验证。
事实上,前端不会发送 AJAX 请求,我们不能期望请求中出现auth JWT头。
在这里我们将采用良好的老cookie认证方法。基于cookie选项,在每个匹配条件的请求头上自动设置cookie。关于这方面的更多信息,请参见前端实现部分。
默认情况下,cookie以分号分隔的键-值对的形式出现在一个字符串中。为了简化解析部分,我们将使用Fastify的Cookieparser插件。
(cookieParser)中的一个或多个。稍后在handler方法中,我们只需要获取感兴趣的cookie,并将其与期望值进行比较。这应该用某种散列和比较算法来代替。
就是这样,我们在文件流端点上进行了身份验证,一切都准备就绪,可以通过前端进行连接。