Загрузите изображение с помощью multer в Firebase Storage - PullRequest
1 голос
/ 09 апреля 2019

Здравствуйте. Я пытаюсь загрузить изображение с помощью Node.js / multer в хранилище firebase (примечание: я знаю, что могу сделать это на стороне клиента, но это должно работать на стороне сервера). Я сталкиваюсь с этой проблемой:

TypeError: storage.ref не является функцией

Я попытался решить, добавив import 'firebase/storage';, как предлагали другие переполнения стека, но это не сработало.

Маршрутизатор:

import {FirebaseManager, FirebaseReferences} from '../database_manager';

router.post("/:uuid/image", upload.single("file"), (req, res) => {
    const tempPath = req.file.path;
    const ext = path.extname(req.file.originalname).toLowerCase();

    if (ext === ".png" || ext === ".jpg") {
        FirebaseManager.upload_image(FirebaseReferences.Images, 'test', req.file)
        res.status(200).contentType("text/plain").end("File uploaded!");
    } else {
        try {
            fs.unlinkSync(tempPath);
        } catch (err) {
            res.status(400).send(err.message);
        }
        res.status(403).contentType("text/plain").end("Only .png/jpg files are allowed!");
    }
  }
);

Менеджер Firebase:

var admin = require('firebase-admin');
import firebase = require('firebase/app');
import 'firebase/database';
import 'firebase/storage';

// Access the real-time database in the initialized application.
const FirebaseApp: firebase.app.App = admin.initializeApp({
  credential: admin.credential.cert({
    projectId: '',
    clientEmail: '',
    privateKey: ''
  }),
  databaseURL: 'https://.firebaseio.com'
});
const db: firebase.database.Database = FirebaseApp.database();
const storage: firebase.storage.Storage = FirebaseApp.storage();

export function upload_image(ref: FirebaseReferences, filename: string,
        file: any): string {

        var upload_loc = ref.toString() + '/' + filename;
        var upload_ref = storage.ref().child(upload_loc);

        upload_ref.put(file).then(function(snapshot) {
            snapshot.ref.getDownloadURL().then(function(downloadURL) {
                console.log('File available at', downloadURL);
                return downloadURL;
            });
        }, function(error) {
            console.log("FirebaseManager, upload_image(): " + error);
            throw error;
        });

        return 'error';
}

Также будет ли работать загрузка типа Express.Multer.File в хранилище? Если нет, то как я могу преобразовать этот тип в тип File?

node 10.2.1
multer 1.4.1
firebase ^5.7.3
firebase-admin ^6.5.0

1 Ответ

2 голосов
/ 19 апреля 2019

Вам не хватает storageBucket в конфигурации для admin.initializeApp

admin.initializeApp({
    credential: admin.credential.cert(serviceAccount),
    storageBucket: "<BUCKET_NAME>.appspot.com"
});

https://firebase.google.com/docs/storage/admin/start

...