Node.js 发送200响应头后http请求失败的方法

Node.js 发送200响应头后http请求失败的方法,node.js,http,express,websocket,xmlhttprequest,Node.js,Http,Express,Websocket,Xmlhttprequest,问题简而言之: 考虑一个长期响应的例子,当有大量数据要发送时。然后,服务器需要将数据传输回客户端,然后才能完成所有数据的生成。如果我是对的,这需要在一开始就发送http头。但是,如果在数据流传输过程中出现异常,那么与客户端通信的最佳方式是什么?理想情况下,我希望浏览器中的XMLHttpRequest出现非200响应代码或类似的错误。我正在服务器上使用nodejs express 详细问题: 我需要将大量数据流到浏览器中,大约700Mb。我需要在生成数据时将数据流传输到客户机,而不是在服务器上对其

问题简而言之:

考虑一个长期响应的例子,当有大量数据要发送时。然后,服务器需要将数据传输回客户端,然后才能完成所有数据的生成。如果我是对的,这需要在一开始就发送http头。但是,如果在数据流传输过程中出现异常,那么与客户端通信的最佳方式是什么?理想情况下,我希望浏览器中的
XMLHttpRequest
出现非200响应代码或类似的错误。我正在服务器上使用nodejs express

详细问题:

我需要将大量数据流到浏览器中,大约700Mb。我需要在生成数据时将数据流传输到客户机,而不是在服务器上对其进行缓冲,否则服务器将耗尽内存

下面是我在浏览器端使用的代码

return new Promise((resolve, reject) => {
  const xhr = new XMLHttpRequest();
  xhr.open('GET', this.getDownloadLink(), true);
  xhr.setRequestHeader('authorization', this.getAuthToken());
  xhr.responseType = 'blob';
  xhr.onload = () => {
    if (xhr.status === 200) {
      saveAsFile(xhr.response);
      resolve();
    }
    else {
      reject(xhr.response);
    }
  };
  xhr.onerror = () => {
    reject(xhr.response);
  };
  xhr.send();
});
我使用XHR是因为我需要设置授权头。在保存文件之前,浏览器可以保留700Mb,这可能是因为它在磁盘上存储blob,这不是阻止程序

所以我开始传播,不知道它会以成功告终。那么,如果中间的数据生成失败,我如何将错误从服务器传递到客户端?strong>我希望在服务器出现故障时拒绝上述承诺。

以下是我在服务器上使用的部分代码:

response.status(200);
db.stream
.on('data', data => response.write())
.on('error', error => {
  // this does not work as intended
  response.status(500);
  response.end(error.message);
})

正如您所看到的,它在发送头之后通过管道传输数据。

发送头,就是这样,没有转折点。客户端不会一次收到整个700mb http响应,而是一块一块地接收。如果我们以明文形式读取http响应,那么它的第一部分将是元数据(状态等)和逐行的标题。这就是为什么在您已经发送了200个状态之后,无法发送500个状态的原因。这不是因为Node.js或express不允许这样做,而是因为http作为一种通信协议不允许这样做。 我可以看到您正在使用http传输这一数量的数据,因为您需要一个用于业务逻辑的头。我建议您查看一下socket.io。它允许您从查询字符串中获取一些有用的信息/数据,您可以将正在使用标题的数据作为查询参数,并通过socket.io节点api访问它!非常方便执行任何身份验证或相关内容。 希望我能帮助你

有一种方法可以在响应结束时发送“标题”。他们被称为

您可以使用nodejs发送它们