【问题标题】:How to create destination path for node.js stream pipe?如何为 node.js 流管道创建目标路径?
【发布时间】:2014-10-09 16:07:48
【问题描述】:

我想将 node.js 流通过管道传输到输出文件中。但我还想确保在开始管道之前存在输出目标。以下代码的问题是管道中的事件处理程序添加较晚(在调用assurePath 回调之后),因此输入流中不再提供数据。我不想使用同步 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
    )

【问题讨论】:

  • 在回调中调用assurePath resuming it 之前是否尝试过pausing your stream?目前无法测试,但我认为它可能会对您有所帮助。
  • 将其添加为答案。

标签: javascript node.js stream coffeescript


【解决方案1】:

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

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

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

【讨论】:

    猜你喜欢
    • 2013-07-02
    • 2011-02-17
    • 1970-01-01
    • 1970-01-01
    • 2023-04-06
    • 2019-06-01
    • 2012-07-29
    • 2019-03-19
    • 1970-01-01
    相关资源
    最近更新 更多