Я разрабатываю веб-приложение, используя Vuejs и Firebase в качестве моего бэкэнда, где вы (без аутентификации) можете создать игрушку. Чтобы построить игрушку, вы можете выбрать 3 различные части (голова, тело и ноги), отображаемые в виде изображений в 3 гладких каруселях, расположенных в вертикальной колонке. После того, как вы выбрали свой любимый дизайн, приложение спросит вашу электронную почту.
Так что мне удалось сохранить все данные заказа в Firebase (часть головы, часть тела, часть ног, имя игрушки, электронная почта клиента, дата заказа), и когда мой клиент нажимает кнопку покупки, я хочу вызвать по электронной почте со всей этой информацией, но , в частности , мне нужно получить URL-адрес загрузки для 3 изображений в Firebase Functions , чтобы каждый раз, когда мой заказчик заказывает игрушку, он / она получал электронное письмо с изображением созданной игрушки. Я использую SendGrid с Firebase для этой цели.
Я могу успешно писать функции Firebase, но когда я пытался связываться с хранилищем, я получаю сообщение об ошибке. Вот мой код:
1) Функция Firebase
const functions = require('firebase-functions');
const storage = require('@google-cloud/storage');
const admin = require('firebase-admin');
admin.initializeApp(functions.config().firebase);
const SENDGRID_API_KEY = functions.config().sendgrid.key;
const sgMail = require('@sendgrid/mail');
sgMail.setApiKey(SENDGRID_API_KEY);
// Function that triggers an email when a new order is created in the database
exports.newOrderEmail = functions.database
.ref('/pedidos/{cleanEmail}/{newOrder}')
.onCreate((snapshot, context)=>{
const cleanEmail = context.params.cleanEmail;
// the new order
const newOrder = context.params.newOrder;
// mail of our customer
const customerEmail = cleanEmail.replace(/\,/g, '.');
const orderData = snapshot.val();
const head = orderData.cabeza;
const body = orderData.cuerpo;
const feet = orderData.patas;
const toyName = orderData.nombre;
const date = orderData.fecha_pedido;
// load Array of images
const toy_images = getAllURLImages(head, body, feet);
const msg = {
to: customerEmail,
from: 'ihojmanb@gmail.com',
subject: 'Tu monomono',
templateId: 'd-f884708acb5f45728e24d0d88442918c',
substitutionWrappers: ['{{', '}}'],
substitutions: {
toy_name: toyName,
head_part: toy_images[0],
body_part: toy_images[1],
feet_part: toy_images[2],
date: order_date,
}
};
return sgMail.send(msg)
});
Методы JavaScript, которые я использую (в том же файле index.js, что и функция Firebase):
// return 3 images that we took from storage
function getAllURLImages(myHead, myBody, myFeet){
var head_image = getImageURL("img/head/", myHead);
var body_image = getImageURL("img/body/", myBody);
var feet_image = getImageURL("img/feet/", myFeet);
return [head_image, body_image, feet_image];
}
// get images from storage, by given path
function getImageURL(imageDir, myImagePath){
var image_path = imageDir + myImagePath + '.png';
console.log('image path: ' + image_path);
// var storage = admin.storage();
var storageRef = storage.ref();
var pathReference = storageRef.child(image_path);
pathReference.getDownloadURL().then(function(url) {
var image_url = url;
console.log('image url: ' + image_url);
return image_url;
}).catch(function(error) {
});
}
Ошибка, которую я получаю на консоли Firebase, говорит:
TypeError: storage.ref is not a function
at getImageURL (/user_code/index.js:84:30)
at getAllURLImages (/user_code/index.js:72:22)
at exports.newOrderEmail.functions.database.ref.onCreate
(/user_code/index.js:48:29)
at cloudFunctionNewSignature (/user_code/node_modules/firebase-
functions/lib/cloud-functions.js:105:23)
at cloudFunction (/user_code/node_modules/firebase-functions/lib/cloud-
functions.js:135:20)
at /var/tmp/worker/worker.js:758:24
at process._tickDomainCallback (internal/process/next_tick.js:135:7)
В других методах моего приложения у меня не было проблем с storage.ref
приветствуется любой совет по функциям Firebase, не могу найти правильный ответ на мою проблему.