【问题标题】:Firebase Cloud functions timeoutFirebase 云函数超时
【发布时间】:2017-11-26 19:28:01
【问题描述】:

以下函数在使用 shell 测试时效果很好,并且数据是在 firestore 中创建的。 当推入 prod 时,它返回 Function execution took 60002 ms, finished with status: 'timeout'

有什么意见吗?

exports.synchronizeAzavista = functions.auth.user().onCreate(event => {

    console.log('New User Created');

    const user = event.data;
    const email = user.email;
    const uid = user.uid;

    return admin.database().ref(`/delegates`)
        .orderByChild(`email`)
        .equalTo(email)
        .once("child_added").then(snap => {
            const fbUserRef = snap.key;

            return admin.firestore().collection(`/users`).doc(`${fbUserRef}`).set({
                email: email,
                uid: uid
            }).then(() => console.log("User Created"));
        });
});

编辑

我已使用以下内容更新了我的代码,但我仍然收到Function returned undefined, expected Promise or value,但我无法确定我的函数返回未定义的位置。为什么我的getUser() 函数没有返回任何内容?

const admin = require('firebase-admin');

admin.initializeApp(functions.config().firebase);

exports.synchronizeAzavista = functions.auth.user().onCreate(event => {

    console.log('New User Created');//This log

    const user = event.data;
    const email = user.email;
    const uid = user.uid;

    console.log('Const are set');//This log

    getUser(email).then(snap => {

        console.log("User Key is " + snap.key);//No log

        const fbUserRef = snap.key;

        return admin.firestore().collection(`/users`).doc(`${fbUserRef}`).set({
            email: email,
            uid: uid
        });
    }).then(() => console.log("User Data transferred in Firestore"));
});

function getUser(email) {

    console.log("Start GetUser for " + email);//This log 

    const snapKey = admin.database().ref(`/delegates`).orderByChild(`email`).equalTo(email).once("child_added").then(snap => {
        console.log(snap.key);//No Log here
return snap;
    });
    return snapKey;
}

【问题讨论】:

    标签: javascript firebase google-cloud-functions google-cloud-firestore


    【解决方案1】:

    你没有从你对 Firestore 的写入中返回一个承诺。

    exports.synchronizeAzavista = functions.auth.user().onCreate(event => {
        const user = event.data;
        const email = user.email;
        const uid = user.uid;
    
        return admin.database().ref(`/delegates`)
            .orderByChild(`email`)
            .equalTo(email)
            .once("child_added").then(snap => {
                const fbUserRef = snap.key;
    
                return admin.firestore().collection(`/users`).doc(`${fbUserRef}`).set({
                    email: email,
                    uid: uid
                });
            });
    });
    

    【讨论】:

    • 谢谢@Frank,这是否意味着 then() 杀死了 set() 的承诺?
    • 否 - 问题不在于 'then' - 您可以包含 then 部分,但您需要返回 Promise,因此 Firebase 知道它必须让您的函数保持活动状态,直到该 Promise 解决。 - 然后firebase可以将Promise的结果解释为成功或错误(rejected promise)
    猜你喜欢
    • 2021-11-01
    • 1970-01-01
    • 2018-11-30
    • 2023-04-02
    • 2022-06-29
    • 2018-05-17
    • 2020-06-09
    • 2018-04-14
    • 2019-01-18
    相关资源
    最近更新 更多