С помощью http-сервера узла я пытаюсь передать поток чтения запроса в поток записи ответа с помощью некоторых промежуточных преобразований, одним из которых является запись в файловую систему.
Конвейер выглядит следующим образом: для простоты удален несоответствующий код:
function handler (req, res) {
req.pipe(jsonParse())
.pipe(addTimeStamp())
.pipe(jsonStringify())
.pipe(saveToFs('saved.json'))
.pipe(res);
}
Пользовательские потоки Transform довольно просты, но у меня нет элегантного способа написания saveToFs
. Это выглядит так:
function saveToFs (filename) {
const write$ = fs.createWriteStream(filename);
write$.on('open', () => console.log('opened'));
write$.on('close', () => console.log('closed'));
const T = new Transform();
T._transform = function (chunk, encoding, cb) {
write$.write(chunk);
cb(null, chunk);
}
return T;
}
Идея состоит в том, чтобы просто направить данные в поток записи, а затем через поток ответов, но fs.createWriteStream(<file.name>)
является только записываемым потоком, поэтому он затрудняет этот подход.
Прямо сейчас у этого кода есть две проблемы, которые я вижу: поток записи никогда не запускает событие закрытия (утечка памяти?), И я хотел бы, чтобы данные проходили через запись файловой системы перед возвратом данных в поток ответов. по существу многоадресной передачи на две раковины.
Буду очень признателен за любые предложения или указания на основные вещи, которые я пропустил.