Я рассмотрел почти все проблемы StackOverflow, связанные с проблемой CORS в Firebase, и ни одна из них, похоже, не работает.
У меня есть некоторые облачные функции в Firebase Functions, которые загружают изображение, если пользователь аутентифицирован. У меня есть два файла: index.js
и user.js
.
Фрагмент из index.js
:
const functions = require("firebase-functions");
const FBAuth = require("./util/fbAuth");
const app = require("express")();
const cors = require("cors")({origin: true});
app.use(cors);
// FBAuth gets a bearer token from firebase and authenticates
app.post("/user/image", FBAuth, uploadImage);
exports.api = functions.https.onRequest(app);
Фрагмент из user.js
exports.uploadImage = (req, res) => {
const BusBoy = require('busboy');
const path = require('path');
const os = require('os');
const fs = require('fs');
const busboy = new BusBoy({ headers: req.headers });
let imageToBeUploaded = {};
busboy.on('file', (fieldname, file, filename, encoding, mimetype) => {
if (mimetype !== 'image/jpeg' && mimetype !== 'image/png') {
return res.status(400).json({ error: 'Wrong file type submitted' });
}
const filepath = path.join(os.tmpdir(), filename);
imageToBeUploaded = { filepath, mimetype };
file.pipe(fs.createWriteStream(filepath));
});
busboy.on('finish', () => {
admin
.storage()
.bucket()
.upload(imageToBeUploaded.filepath, {
resumable: false,
metadata: {
metadata: {
contentType: imageToBeUploaded.mimetype
}
}
})
.then(() => {
const imageUrl = `https://firebasestorage.googleapis.com/v0/b/${
config.storageBucket
}/o/${imageFileName}?alt=media`;
return db.doc(`/users/${req.user.handle}`).update({ imageUrl });
})
.then(() => {
return res.json({ message: 'image uploaded successfully' });
})
.catch((err) => {
console.error(err);
return res.status(500).json({ error: 'something went wrong' });
});
});
busboy.end(req.rawBody);
};
Frontend в редуксе / React, размещенный на веб-сайте Firebase app:
export const uploadImage = (formData) => (dispatch) => {
dispatch({ type: LOADING_USER });
axios
.post("/user/image", formData)
.then(() => {
dispatch(getUserData());
})
.catch((err) => console.log(err));
};
Что я пробовал:
Я пытался использовать gsutil cors set cors.json
. Проблема в том, что все остальные мои функции работают нормально, только когда я загружаю изображение в хранилище Google, происходит сбой.
Ошибка:
Доступ к XMLHttpRequest в «cloudfunction / user / image» от источника «link.firebaseapp.com» был заблокирован политикой CORS: в запрошенном ресурсе отсутствует заголовок «Access-Control-Allow-Origin».
Что я делаю не так?