首页 > 解决方案 > 如何在koa流中将错误转发给客户端?

问题描述

我不知道如何在 Koa 应用程序中将流错误传递给客户端。我有:

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}
}

在我的客户中:

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:内部服务器错误响应。

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

标签: node.jsstreampipelinekoa

解决方案


答案似乎是,一旦流通过管道传输到响应,并且字节流向客户端,部分流响应已经在客户端上,并且不能自发地切换到 JSON 错误响应。

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


推荐阅读