node.js - 如何在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:内部服务器错误响应。
如何将流错误传递给客户端,以便显示+记录它?
解决方案
答案似乎是,一旦流通过管道传输到响应,并且字节流向客户端,部分流响应已经在客户端上,并且不能自发地切换到 JSON 错误响应。
可以在服务器上记录流错误,但在这种情况下,客户端无需再做任何事情,除了在响应解析中捕获错误Body.json()
并注意流失败。
推荐阅读
- .net - IIS Express applicationHost.config 文件包含无效条目,必须先更正才能打开项目
- java - 有没有一种方法可以在 onStop() 立即调用活动?
- android-studio - findFragmentById 返回空值
- python - python中的文本转换问题
- php - POST 值未检索到 AJAX/JQUERY
- spring - Spring Boot 微服务中如何维护 Session
- javascript - Vue.js 相当于 appendChild 动态添加新元素/组件?
- javascript - Bootstrap Datepicker 不在服务器上工作,但在本地工作
- svg - 如何从 SVG 图像中删除所有颜色?
- java - 从 Java 中的 Lambda 修改本地对象状态的设计选择错误?