我创建一个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.
})
})
答案 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
如果字节数少于highWaterMark
,pause
将不会在reader
上发出,因此不会创建文件。
提醒您-如果这不是模拟的,您可能需要关闭连接并进行清理,否则您可能会挂起这些连接并等待读取,很快您将耗尽传入的连接限制或可用内存。