Только одна из многих функций Firebase вызывается - PullRequest
0 голосов
/ 07 ноября 2019

У меня есть 2 функции Firebase, которые я хочу выполнить, когда есть запрос Http, одна функция (createEmailList) для сохранения данных в базе данных Firebase, другая (zohoCrmHook) для сохранения в CRM стороннего производителяназывается Зохо.

Когда функции развернуты в Firebase, журнал функций показывает, что обе функции развернуты правильно. Однако, когда запрос Http сделан из внешнего интерфейса, журнал показывает, что выполняется только одна из функций (createEmailList).

enter image description here

Как показывает журнал, выполняется первая функция createEmailList, и данные без проблем отображаются в базе данных Firebase. Однако вторая функция zohoCrmHook даже не выполняется.

index.js

const functions = require('firebase-functions');
const admin = require("firebase-admin")
const serviceAccount = require("./service_account.json");
const createEmailList = require('./createEmailList')

// zoho
const zohoCrmHook = require('./zohoCrmHook')

admin.initializeApp({
  credential: admin.credential.cert(serviceAccount),
  databaseURL: "https://landing-page.firebaseio.com"
})

exports.zohoCrmHook = functions.https.onRequest(zohoCrmHook)
exports.createEmailList = functions.https.onRequest(createEmailList)

createEmailList.js

const admin = require('firebase-admin')
const cors = require('cors')({ origin: true })

module.exports = (req, res) => {
    cors(req, res, () => {
        if (!req.body.email) {
            return res.status(422).send({ error: 'Bad Input'})
        }

        const email = String(req.body.email)
        const firstName = String(req.body.firstName)
        const lastName = String(req.body.lastName)

        const data = {
            email,
            firstName,
            lastName
        }

        const db = admin.firestore()
        const docRef = db.collection('users')
            .doc(email)
            .set(data, { merge: false })
            .catch(err => res.status(422).send({ error: err }))

        res.status(204).end();    
    })
}

zohoCrmHook.js

const axios = require('axios');
const functions = require('firebase-functions');

// zoho
const clientId = functions.config().zoho.client_id;
const clientSecret = functions.config().zoho.client_secret;
const refreshToken = functions.config().zoho.refresh_token;
const baseURL = 'https://accounts.zoho.com';

module.exports = async (req, res) => {
    const newLead = {
        'data': [
        {
            'Email': req.body.email,
            'Last_Name': req.body.lastName,
            'First_Name': req.body.firstName,
        }
        ],
        'trigger': [
            'approval',
            'workflow',
            'blueprint'
        ]
    };

    const { data } = await getAccessToken();
    const accessToken = data.access_token;

    const leads = await getLeads(accessToken);
    const result = checkLeads(leads.data.data, newLead.data[0].Email);

    if (result.length < 1) {
        try {
            return res.json(await createLead(accessToken, newLead));
        }
        catch (e) {
            console.log(e);
        }
    }
    else res.json({ message: 'Lead already in CRM' })
}

function getAccessToken () {
    const url = `https://accounts.zoho.com/oauth/v2/token?refresh_token=${refreshToken}&client_id=${clientId}&client_secret=${clientSecret}&grant_type=refresh_token`;

    return new Promise((resolve, reject) => {
      axios.post(url)
        .then((response) => {
          return resolve(response);
        })
        .catch(e => console.log(e))
    });
}

function getLeads(token) {
    const url = 'https://www.zohoapis.com/crm/v2/Leads';

    return new Promise((resolve, reject) => {
      axios.get(url, {
        headers: {
          'Authorization': `Zoho-oauthtoken ${token}`
        }
      })
        .then((response) => {
          return resolve(response);
        })
        .catch(e => console.log(e))
    })
}

function createLead(token, lead) {
    const url = 'https://www.zohoapis.com/crm/v2/Leads';

    return new Promise((resolve, reject) => {
        const data = JSON.stringify(lead);
        axios.post(url, data, {
        headers: {
            'Authorization': `Zoho-oauthtoken ${token}`
        }
        })
        .then((response) => {
            console.log(response.data)
            return resolve(response);
        })
        .catch(e => reject(e))
    })
}

function checkLeads(leads, currentLead) {
    return leads.filter(lead => lead.Email === currentLead)
}

1 Ответ

1 голос
/ 07 ноября 2019

Поскольку вы экспортируете две декларации functions.https.onRequest, вы получите две облачные функции, каждая со своим собственным URL / конечной точкой. Так что, если это то, что вам нужно, вам нужно настроить две веб-ловушки, которые вызывают эти функции.


Однако, прочитав ваш вопрос, вы поймете, что вам нужна одна облачная функция, которая выполняет две функции, в этом случае у вас должна быть только одна functions.https.onRequest декларация, которая затем вызывает две обычные функции JavaScript (например).

Так что-то вроде:

exports.myWebHook = functions.https.onRequest(function(req, res) {
  zohoCrmHook(...);
  createEmailList(...);
})

Вам понадобитсявыясните, что передать в эти два вызова функций, поскольку вы не можете передать запрос и ответ вместе.

В качестве альтернативы вы можете вызвать две функции Cloud отсюда, но это обычно просто увеличивает ваши затраты смало пользы.

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