【问题标题】:Proper send file with NodeJS使用 NodeJS 正确发送文件
【发布时间】:2016-11-05 10:12:06
【问题描述】:

考虑以下相当琐碎的中间件:

(req, res, next) => {
  const stream = fs.createReadStream(req.filePath)

  await new Promise((resolve, reject) => stream    
    .on('error', reject)
    .on('end', resolve)
    .pipe(res, { end: false })
    .on('error', reject)
    // 'close' is emitted if client prematurely disconnects.
    .on('close', resolve)
  res.end()
}

有几个问题我不确定如何处理:

  • 如果 res 在此中间件运行之前已经发出“关闭”信号,它将被卡住。
  • 如果 res 发出 closeerror 如何清理源流? autoClose 只会在end 上运行,只有在读取所有数据后才会运行。但是,如果目标失败,它是如何传播到源的?我是否应该始终在源流上调用destroy

【问题讨论】:

    标签: javascript node.js express node-streams


    【解决方案1】:

    这似乎可以解决问题:

    import onFinished from 'on-finished'
    
    (req, res, next) => {
      const stream = fs.createReadStream(req.filePath)
    
      onFinished(res, () => stream.destroy && stream.destroy())
    
      if (onFinished.isFinished(res)) {
        return
      }
    
      await new Promise((resolve, reject) => stream    
        .on('error', reject)
        .on('end', resolve)
        .pipe(res, { end: false })
        .on('error', reject)
        // 'close' is emitted if client prematurely disconnects.
        .on('close', resolve)
      res.end()
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-01-31
      • 1970-01-01
      • 1970-01-01
      • 2016-08-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多