Использование пользовательского хранилища с Multer - PullRequest
0 голосов
/ 18 марта 2020

Я пытаюсь использовать multer для хранения Firebase. Я настроил механизм хранения, следуя этому руководству: do c. Исходя из этого, я написал следующее class определение:

const { image_types } = require('./enums');

module.exports.FirebaseStorage = class {
    constructor(opts) {
        const { destination, typeHandler, getName, bucket } = opts;
        if(!getName || !bucket) {
            throw new Error('Bucket and/or getName callbacks are undefined');
        }
        this.typeHandler = typeHandler ? typeHandler : (req, file) => {
            switch(file.mimetype) {
                case image_types.IMG_JPEG:
                case image_types.IMG_PNG:
                    return true;
                default:
                    throw new Error('Mismatched image mime type');
            }
        };
        this.bucket = bucket;
        this.getName = getName;
        if(!destination) {
            // define
            this.getDestination = (req, file, cb) => {
                const n = this.getName(file);
                const _f = this.bucket.file(n);
                cb(null, _f);
            }
        }
        else {
            this.getDestination = destination;
        }
    }
    _handleFile(req, file, cb) {
        /*
            * This method is exposed to multer to save the file
            * 
        */
        try {
            console.log(`Uploading File`);
            const typeChecked = this.typeHandler(req, file);
            if(typeChecked) {
                this.getDestination(req, file, (err, f) => {
                    if(err) {
                        return cb(err, null);
                    }
                    const wrtStream = f.createWriteStream();
                    file.stream.pipe(wrtStream);
                    wrtStream    
                        .on('error', (err) => cb(err, null))
                        .on('finish', () => {
                            console.log(`File Uploaded`);
                            cb(null, true);
                        });
                });
            }
        } catch(e) {
            throw e;
        }
    }
    _removeFile(req, file, cb) {
        /*
            * Removes a file that exists
        */
    }
}

. В коде getName возвращает случайное ха sh на основе имени файла и других мета-свойств, f является Firebase File экземпляр. Моя проблема в том, что при загрузке файла метод _handleFile не вызывается. Вот как я настраиваю multer с помощью этого пользовательского механизма хранения:

const imageStore = multer({
      storage: new FirebaseStorage({
         bucket,
         getName: generateFileName, 
    })
});

Маршрут настроен так:

serv.post('/upImg', imageStore.single('avatar'), async (req, res, nxt) => {
    console.log(req.body);
    res.json({
        status: 200,
        message: 'Uploaded'
     });
})

Когда я отправляю запрос с использованием CURL, я получаю 200 Uploaded но ни файл не загружен, ни console.log внутри _handleFile не вызываются. Это означает, что multer даже не вызывает _handleFile. Вот запрос, который я пытаюсь выполнить:

curl -X POST -H 'Content-Type:multipart/form-data' -F 'avatar=@path/to/image.png' http://localhost:5001/project/region/service/upImg

Я уверен, что мне не хватает определенного шага настройки ключа. Я искал несколько часов безуспешно, поэтому любые советы или предложения будут высоко оценены. Спасибо.

Примечание Не дошло до того, что может быть выполнен код загрузки Firebase, поэтому не уверен, есть ли какие-либо ошибки времени выполнения.

...