Хранение изображения с использованием облачных функций для Firebase
Я пытаюсь реорганизовать некоторый код для использования облачных функций для Firebase. Код должен хранить изображение по пути в хранилище Firebase. По большей части код такой же, как и раньше, но теперь вместо
server.post('/', (req, res) => {
// Some code
}
Я использую следующее в соответствии с документацией Firebase
exports.getProcessedImage = functions.https.onRequest((req, res) => {
// Some code
});
Код работал раньше, но теперь у меня возникают проблемы с сохранением моего тестового изображения в Firebase. Не уверен почему. Я проверяю вкладку Network в инструментах разработчика, и конечная точка getProcessedImage запускает код, который запускается, и отвечает кодом 200, поэтому не уверен, в чем проблема. Заранее благодарю за любую помощь!
Мой полный код ниже:)
const functions = require('firebase-functions');
const admin = require('firebase-admin');
admin.initializeApp(functions.config().firebase);
const request = require('request');
const crypto = require('crypto');
const storage = require('@google-cloud/storage');
// Firebase Project ID and Service Account Key.
const gcs = storage({
projectId: 'snapshelf-aabb55',
keyFilename: './serviceAccountKey.json'
});
const bucket = gcs.bucket('snapshelf-aabb55.appspot.com');
function saveImage(url) {
// Generate a random HEX string using crypto (a native node module).
const randomFileName = crypto.randomBytes(16).toString('hex');
// Fetch image info using a HTTP HEAD request.
// https://developer.mozilla.org/en-US/docs/Web/HTTP/Methods/HEAD
request.head(url, (error, info) => {
if (error) {
return console.error(error);
}
// Download image from Pixelz, then save the image to Firebase
// using the Google Cloud API and the magic of Node Streams.
// https://googlecloudplatform.github.io/google-cloud-node/#/docs/google-
cloud/v0.52.0/storage/file
// http://stackru.com/questions/28355079/how-do-node-js-streams-work
request(url)
.pipe(
bucket.file(`sample/images/${randomFileName}`).createWriteStream({
metadata: {
contentType: info.headers['content-type']
}
})
)
.on('error', (err) => {
// Do something if the upload fails.
console.error(err);
})
.on('finish', () => {
// Do something when everything is done.
// Get download url for stored image
console.log('Image successfully uploaded to Firebase Storage!')
});
});
}
exports.getProcessedImage = functions.https.onRequest((req, res) => {
console.log(req.body.processedImageURL);
/*
if (req.body && req.body.processedImageURL) {
// Get image from Pixelz and save it to Firebase Storage.
saveImage(req.body.processedImageURL);
return res.status(200).end();
}
res.status(400).end();
*/
const url = 'https://www2.chemistry.msu.edu/courses/cem352/SS2017_Wulff/MichiganState.jpg'
console.log(url);
saveImage(url);
console.log('Saving url');
res.status(200).send();
});
2 ответа
Развертываете ли вы свою функцию на Firebase с помощью Spark Plan (бесплатно)?
Если ответ да, ваша проблема из-за этого:
Проекты Firebase в плане Spark могут отправлять только исходящие запросы в API Google. Запросы сторонних API не выполняются с ошибкой. Для получения дополнительной информации об обновлении вашего проекта.
Поскольку вы пытаетесь сделать внешний запрос, при выполнении вашей функции ничего не происходит:(
Это легко прямо сейчас! Так как у вас есть админ. просто поменяй
const bucket = gcs.bucket('snapshelf-aabb55.appspot.com');
в
const bucket = admin.storage().bucket();