Почему разные доступные для записи потоки вызывают обработчик событий один и тот же обработчик событий (одинаковые параметры закрытия) - PullRequest
0 голосов
/ 28 мая 2020

У меня есть следующая функция, которая вызывается дважды подряд.

writeStream(readStream, options) {
        const { isTemp, mimetype, onFinish } = options;

        const match = FILE_EXTENSION_FROM_CONTENT_TYPE.exec(mimetype);
        const fileExtension = match && match[1] ? match[1] : "octet-stream";
        const name = uuid() + "." + fileExtension;
        const filePath = isTemp ? this.tempFilesRoot + name : this.filesRoot + name;

        const writeStream = fs.createWriteStream(filePath, options);

        writeStream.on("close", () => {
            console.log(writeStream.path + "\n");        < test
            console.log(name);                           < test

            if (onFinish) {
                onFinish(name);
            }
        });

        readStream.pipe(writeStream);
    }

следующий результат:

enter image description here

Проблема в том, что обработчик события close вызывается дважды с одними и теми же параметрами закрытия, которые являются name и writeStream ПЕРВОГО файла. Файлы сохраняются нормально, без проблем. Более того, если я заменю on на once, обработчик вызывается один раз с теми же параметрами. Хотя мой код не генерирует эти два readStream, они разные.

Изменить:

Вот код вызова (я использую busboy для обработки синтаксического анализа формы):

handler.on("file", function (fieldname, stream, filename, encoding, mimetype) {
                Logger.logInfo(`Started receiving file '${filename}', field name '${fieldname}'`);

                // Here I call the function above
                const tempFileName = FilesManager.writeStream(stream, {
                    mimetype,
                    emitClose: true,
                    isTemp: true,
                    onFinish: function () {
                        Logger.logSuccess(`Finished receiving file '${filename}'`, {
                            config: "requests",
                            prefix: "FORM_HANDLER",
                        });

                        req.receivedFiles.push(tempFileName);
                        req.formData[fieldname] = {
                            type: FORM_FIELD_TYPE.FILE,
                            val: tempFileName,
                        };
                    }
                });

            });
...