【问题标题】:Node.js, streams, files and error handlingNode.js、流、文件和错误处理
【发布时间】:2018-08-06 19:26:25
【问题描述】:

问题

  1. 如何优雅地处理流错误?我的代码变得非常丑陋,并且在每个 .pipe(…) 之后添加 .on('error', () => …) 都会让人头疼。还有其他方法吗?我读过关于 NodeJS domain 的文章,但它已被弃用。

  2. 如果错误发生在流中间的某个地方,您如何处理?在我的例子中,到那时 一些 转换后的内容已经传回给用户。

我的用例是:

  1. 用户通过典型的多部分<form>上传文本文件。
  2. 然后使用流动态转换该文件。
  3. 结果是一个流,通过管道传回给用户并触发下载。

简而言之:添加文件,提交表单,然后返回转换后的文件。

代码示例

以下代码使用 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


【解决方案1】:

您应该查看pump。似乎它可能有助于解决您的问题。

【讨论】:

    猜你喜欢
    • 2014-03-13
    • 2013-12-02
    • 1970-01-01
    • 1970-01-01
    • 2013-11-30
    • 2012-04-03
    • 1970-01-01
    相关资源
    最近更新 更多