如何为node.js流管道创建目标路径?

时间:2014-08-15 21:39:22

标签: javascript node.js stream coffeescript

我想将node.js流传输到输出文件中。但我还想在开始管道之前确保输出目的地存在。以下代码的问题是管道中的事件处理程序被添加到较晚(调用assurePath回调之后),因此输入流中的数据不再可用。我不想使用sync fs方法来阻止整个过程。

assurePath = (path, callback) ->
  path = path.split path.sep
  i = 0
  async.eachSeries path[1...path.length-1], (segment, callback) =>
    i++
    p = path[0..i].join path.sep
    fs.exists p, (exists) =>
      return callback() if exists
      fs.mkdir p, callback
  ,
    callback

saveStream = (filename, stream, callback) ->
  path = fullPath filename
  assurePath path, (error) ->
    return callback error if error

    finished = false
    stream.on('error', (error) ->
      return if finished
      finished = true
      callback error
    ).pipe(
      fs.createWriteStream path
    ).on('finish', ->
      return if finished
      finished = true
      callback()
    ).on('error', (error) ->
      return if finished
      finished = true
      callback error
    )

1 个答案:

答案 0 :(得分:0)

您可以在调用assurePath之前尝试pausing your stream,然后在回调中调用resuming it

saveStream = (filename, stream, callback) ->
  stream.pause()
  path = fullPath filename
  assurePath path, (error) ->
    stream.resume()
    # ...

调用.pause()会导致stream停止发出数据事件。任何可用的数据都将保留在内部缓冲区中。在.resume()回调中调用assurePath会导致stream恢复发送数据事件。