Busboy закончить не выстрелил - PullRequest
1 голос
/ 24 сентября 2019

Я хочу передать исходный поток файлов вниз на другой уровень кода, который будет обрабатывать поведение при последующем сбросе на диск (загрузка в облачное хранилище).Поскольку размер файла может быть большим, я не могу полностью буферизовать входящий файл.Я предполагаю, что PassThrough поток должен передавать необходимые данные.В то время как file.resume уже вызвано, событие finish никогда не вызывается.

Как собрать все необходимые поля формы вместе с одним файловым потоком и сделать правильный сервисный вызов, без явного полного файла в памяти или локальном хранилищедиск, как у меня есть несколько из них обоих?

private collectMultipartRequest (req: Request, fileFieldName: string): Promise<{ file: IFile, fields: { [k: string]: string }}> {
        const obj = {
            file: null,
            fields: {}
        };

        return new Promise ((resolve, reject) => {
            const busboy = new Busboy({ headers: req.headers, limits: { files: 1 }});

            busboy.on("file", (fieldname, file, filename, mimetype) => {
                if (fieldname === fileFieldName) {
                    const passThrough = new PassThrough();
                    file.pipe(passThrough);

                    obj.file = <IFile>{
                        mimeType: mimetype,
                        name: filename,
                        readStream: passThrough
                    };
                }
                file.resume();
            });

            busboy.on("field", (fieldName, val) => {
                obj.fields[fieldName] = val;
            });

            busboy.on("filesLimit", () => {
                reject(obj);
            });

            busboy.on("finish", async () => {
                resolve(obj);
            });

            req.pipe(busboy);
        });
    }
...