后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访问它需要一些有用的信息/数据!非常方便进行任何认证或相关的东西。希望我帮助你!
后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访问它需要一些有用的信息/数据!非常方便进行任何认证或相关的东西。希望我帮助你!