Функции Firebase - отправка электронной почты с изображением - PullRequest
0 голосов
/ 06 ноября 2018

Я разрабатываю веб-приложение, используя 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, не могу найти правильный ответ на мою проблему.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...