【发布时间】:2018-08-06 19:26:25
【问题描述】:
问题
如何优雅地处理流错误?我的代码变得非常丑陋,并且在每个
.pipe(…)之后添加.on('error', () => …)都会让人头疼。还有其他方法吗?我读过关于 NodeJSdomain的文章,但它已被弃用。如果错误发生在流中间的某个地方,您如何处理?在我的例子中,到那时 一些 转换后的内容已经传回给用户。
我的用例是:
- 用户通过典型的多部分
<form>上传文本文件。 - 然后使用流动态转换该文件。
- 结果是一个流,通过管道传回给用户并触发下载。
简而言之:添加文件,提交表单,然后返回转换后的文件。
代码示例
以下代码使用 express 处理 HTTP 请求,使用 busboy 处理文件上传:
export default Router()
.get('/', renderPage)
.post('/', (req, res, next) => {
const busboy = new Busboy({ headers: req.headers })
const parser = myParser()
const transformer = myTransformer()
busboy.on('file', (_fieldname, file, filename) => {
res.setHeader('Content-disposition', `attachment; filename=${filename}`)
file
.pipe(parser)
.on('error', err => errorHandler(err, req, res))
.pipe(transformer)
.on('error', err => errorHandler(err, req, res))
.pipe(res)
.on('error', err => errorHandler(err, req, res))
})
.on('error', err => errorHandler(err, req, res))
req.pipe(busboy)
.on('error', err => errorHandler(err, req, res))
})
【问题讨论】:
-
你的管道链末端不能只有一个
.on('error', ...)吗? -
在数据传输过程中发生错误时该怎么办始终是特定于应用程序的,并且通常也需要在另一端进行适当的错误处理。
-
@jfriend00 我明白这一点。我想知道告诉客户此时发生错误的常见/最佳方式是什么。标头已经发送,
5xx状态码为时已晚。 -
如果这是您的问题,那么请编辑您的问题以更简洁地陈述它。这不是我从阅读你的问题中得到的。
标签: javascript node.js express busboy