我不能使用writeFileStream创建文件吗?

时间:2019-08-09 00:00:18

标签: node.js stream fs

我创建一个writeFileStream并将其与可读流管道连接。

在处理数据时,我检查数据的长度以确保长度太短,不要使用writeFileStream创建文件。

我可以中止使用writeFileStream创建文件,还是在文件创建后取消链接?

感谢您的帮助。

const fs = require('fs')
const { ReadableMock } = require('stream-mock')
const { assert } = require('chai')

describe.only('fs', () => {
  const expectedPath = './file.txt'
  const input = 'abc'
  const reader = new ReadableMock(input)
  const writer = fs.createWriteStream(expectedPath)

  before((done) => {
    let index = 0
    reader.pipe(writer)
    reader.on('data', () => {
      index++
      if (index === 1) {
        reader.unpipe(writer)
        done()
      }
    })
  })

  after(() => {
    fs.unlinkSync('./file.txt')
  })

  it('should not create file', () => {
    assert.isFalse(fs.existsSync(expectedPath)) // expected true to be false.
  })
})

1 个答案:

答案 0 :(得分:0)

为了实现您要实现的目标,我将创建一个PassThrough流,并使用highWaterMark告诉我该流何时被填充-您不需要太多代码,并且流将为您提供很少的开销而您不会注意到(不会写入磁盘或从HTTP读取)。 ;)

这就是我要做的:

  const reader = new ReadableMock(input)
  const checker = new PassThrough({
    highWaterMark: 4096  // or how many bytes you need to gather first
  });

  reader
    .once('pause', () => checker.pipe(fs.createWriteStream(expectedPath)))
    .pipe(checker);

这里发生的是:

  • reader通过管道传递到checker,后者未连接任何东西,但是具有允许的高WaterMark字节级别(您可以在其中添加编码以使用char而不是字节)
  • checker已暂停,但在管道reader上将暂停并尝试尽可能多地写入
  • checker将接受一些数据,然后在写入时返回false,这将在pause上发出reader事件
  • 监听器现在仅创建writer及其基础文件,并通过管道传送checker
  • checker不会暂停,因此reader

如果字节数少于highWaterMarkpause将不会在reader上发出,因此不会创建文件。

提醒您-如果这不是模拟的,您可能需要关闭连接并进行清理,否则您可能会挂起这些连接并等待读取,很快您将耗尽传入的连接限制或可用内存。