Привет всем, я делаю приложение и использую firebase в качестве базы данных, сервера аутентификации и хранилища для образа, так как для него требуется образ хранилища, мне нужно написать некоторый код на стороне сервера.
Это код, который я уже пишу:
const functions = require('firebase-functions');
const cors = require('cors')({ origin: true });
const Busboy = require('busboy');
const os = require('os');
const path = require('path');
const fs = require('fs');
const fbAdmin = require('firebase-admin');
const uuid = require('uuid/v4');
// // Create and Deploy Your First Cloud Functions
// // https://firebase.google.com/docs/functions/write-firebase-functions
//
// exports.helloWorld = functions.https.onRequest((request, response) => {
// response.send("Hello from Firebase!");
// });
const gcconfig = {
projectId: 'my-project-id',
keyFilename: 'myprojectkeyfile.json'
};
const gcs = require('@google-cloud/storage')(gcconfig);
fbAdmin.initializeApp({ credential:
fbAdmin.credential.cert(require('./myprojectkeyfile.json')) });
exports.storeImage = functions.https.onRequest((req, res) => {
return cors(req, res, () => {
if (req.method !== 'POST') {
return res.status(500).json({ message: 'Not allowed.' });
}
if (!req.headers.authorization ||
!req.headers.authorization.startsWith('Bearer ')) {
return res.status(401).json({ error: 'Unauthorized.' });
}
let idToken;
idToken = req.headers.authorization.split('Bearer ')[1];
const busboy = new Busboy({ headers: req.headers });
let uploadData;
let oldImagePath;
busboy.on('file', (fieldname, file, filename, encoding, mimetype) => {
const filePath = path.join(os.tmpdir(), filename);
uploadData = { filePath: filePath, type: mimetype, name: filename };
file.pipe(fs.createWriteStream(filePath));
});
busboy.on('field', (fieldname, value) => {
oldImagePath = decodeURIComponent(value);
})
busboy.on('finish', () => {
const bucket = gcs.bucket('my-project-id.appspot.com');
const id = uuid();
let imagePath = 'images/' + id + '-' + uploadData.name
if (oldImagePath) {
imagePath = oldImagePath;
}
return fbAdmin.auth().verifyIdToken(idToken).then(decodedToken => {
return bucket.upload(uploadData.filePath, {
uploadType: 'media',
destination: imagePath,
metadata: {
metadata: {
contentType: uploadData.type,
firebaseStorageDownloadTokens: id
}
}
});
})
.then(() => {
return res.status(201).json({
imageUrl: 'https://firebasestorage.googleapis.com/v0/b/' + bucket.name + '/o/' +
encodeURIComponent(imagePath) + '?alt=media&token=' + id,
imagePath: imagePath
});
})
.catch(error => {
return res.status(401).json({ error: 'Unauthorized!' });
});
});
return busboy.end(req.rawBody);
});
});
exports.deleteImage =
functions.database.ref('/products/{productId}').onDelete(snapshot => {
const imageData = snapshot.val();
const imagePath = imageData.imagePath;
const bucket = gcs.bucket('my-project-id.appspot.com')
return bucket.file(imagePath).delete();
});
Теперь этот код работает нормально, за исключением одной вещи: если я обновляю изображение в моем приложении, сервер должен заменить старое изображение, загруженное новымодин, но этого не происходит, вместо этого сервер всегда добавляет вместо изображения старый образ.
Поэтому я хочу обойти эту проблему, добавив функцию, запускаемую при обновлении чего-либо в моей базе данных;поэтому, когда я делаю это, сервер должен добавить новое изображение, а также найти старое и удалить его.Я пытаюсь написать этот код, но так как я не знаю слишком много javascript (это весь код, который я пишу в javascript в своей жизни), наверняка я допустил некоторые ошибки, вот что я пишу:
exports.deleteOnUpdateImage = functions.database.ref('/products/{productId}').onUpdate(snapshot => {
const oldData = snapshot.before.val();
const newData = snapshot.after.val();
const oldImagePath = oldData.imagePath;
const oldImageUrl = oldData.imageUrl;
const newImageUrl = newData.imageUrl;
const bucket = gcs.bucket('my-project-id.appspot.com')
if (oldImageUrl != newImageUrl) {
return bucket.file(oldImagePath).delete();
}
})
Можете ли вы сказать мне, как это исправить и заставить это работать ??
Мне очень жаль, если мой английский не идеален и если вам нужны другие детали, скажите мне !!
Спасибо !!!