最新消息:雨落星辰是一个专注网站SEO优化、网站SEO诊断、搜索引擎研究、网络营销推广、网站策划运营及站长类的自媒体原创博客

后200响应头故障的http请求的方式发送

运维笔记admin13浏览0评论

后200响应头故障的http请求的方式发送

后200响应头故障的http请求的方式发送

问题在短期:

考虑的持久应答的情况下,当有大量的数据要发送。然后,服务器需要精加工产生的所有数据之前,将数据发送回客户端。这需要发送的HTTP标头在一开始,如果我是对的。但是,如果一个异常数据流式处理过程中提出,什么是传达给客户最好的方法是什么?理想情况下,我想XMLHttpRequest在浏览器失败,非200响应代码或类似的东西。我使用的是表达的NodeJS服务器上。

问题详细:

我需要大量的数据流到浏览器中,约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因为我需要设置授权头。浏览器是确定与保存文件,可能是因为它存储在磁盘上的blob之前保持700MB,这不是一个拦截器。

于是,我开始发送不知道它会成功结束。那我怎么沟通的错误,从服务器到客户端,如果数据生成中间失败了呢?我想上面的承诺,当服务器出现故障时拒绝。

下面是我使用的服务器上的代码的一部分:

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响应为明文,它的第一部分将元数据(状态等)以及极头逐行。这就是为什么它是不可能的,发送500种状态,你已经发出200不是因为Node.js的后或表达不允许它的原因,而是因为非常HTTP作为通信协议,不允许它。我可以看到你正在使用HTTP传输这个数据量,因为你需要一个标题为您的业务逻辑。我建议你采取socket.io看看。它可以让你从查询字符串,在那里你可以把你的数据,你所使用的标头,作为查询参数,并通过socket.io节点API访问它需要一些有用的信息/数据!非常方便进行任何认证或相关的东西。希望我帮助你!

发布评论

评论列表(0)

  1. 暂无评论