Node.js 如何在膝关节炎流中向客户端转发错误? 我无法理解如何在膝关节炎应用程序中向客户端发送流错误。我有: try { const res = await request.request({...streamingRequestConfig}); ctx.body = new Passthrough(); // node stream.Passthrough, per https://github.com/koajs/koa/blob/master/docs/api/response.md#stream pipeline(res.data, ctx.body, err => { ctx.body = {streamError: err} }); // (1) This error appears in pipeline() error handler, // but client receives only a 500 with no parseable body // res.data.emit('error', new Error('Test stream error'); // (2) This error is caught below and returned to client // in response body, parseable with Body.json() // throw new Error('Test request error'); } catch (err) { ctx.body = {requestError: err} }

Node.js 如何在膝关节炎流中向客户端转发错误? 我无法理解如何在膝关节炎应用程序中向客户端发送流错误。我有: try { const res = await request.request({...streamingRequestConfig}); ctx.body = new Passthrough(); // node stream.Passthrough, per https://github.com/koajs/koa/blob/master/docs/api/response.md#stream pipeline(res.data, ctx.body, err => { ctx.body = {streamError: err} }); // (1) This error appears in pipeline() error handler, // but client receives only a 500 with no parseable body // res.data.emit('error', new Error('Test stream error'); // (2) This error is caught below and returned to client // in response body, parseable with Body.json() // throw new Error('Test request error'); } catch (err) { ctx.body = {requestError: err} },node.js,stream,pipeline,koa,Node.js,Stream,Pipeline,Koa,在我的客户中: const res = await fetch(url); try { const data = await res.json(); const error = data.streamError || data.requestError; if (error) { // Error thrown from (2) is caught here displayErrorToUser(error); } } catch (err) { // Err

在我的客户中:

const res = await fetch(url);
try {
  const data = await res.json();
  const error = data.streamError || data.requestError;
  if (error) {
    // Error thrown from (2) is caught here
    displayErrorToUser(error);
  }
} catch (err) {
  // Error thrown from (1) is caught here, but not parseable;
  // it is a generic 500
  console.error('Parse error')
}
如注释中所述,抛出(2)会生成一个响应主体,其中包含一个可以在客户端上解析的错误,但是流错误(如(1)中所模拟的)会响应一个通用的500:内部服务器错误


如何将流错误传递给客户端,以便显示并记录它?

答案似乎是,一旦流通过管道传输到响应,并且字节流传输到客户端,部分流响应就已经在客户端上,无法自动切换到JSON错误响应


可以在服务器上记录流错误,但在这种情况下,除了捕获
Body.json()
响应解析中的错误并注意流失败之外,客户端无需做其他事情。

我认为错误处理程序在流已经通过管道传输到响应(
ctx.Body
)后启动,但我不知道如何改变…你想处理什么错误?如果中途出现故障,那么客户机就没有什么可以做的了。如果它们已经有一个200响应和半个json对象,那么内容长度将不匹配,请求将失败。您不能用新的json错误替换现有的响应。但您可以在本地的错误处理程序中登录