【问题标题】:Firebase Cloud Async Error(Function returned undefined, expected Promise or value)Firebase Cloud 异步错误(函数返回未定义、预期的 Promise 或值)
【发布时间】:2019-03-05 05:47:34
【问题描述】:

首先,提前感谢您抽出宝贵时间阅读本文。

我一直在为我的 Firebase 应用开发云功能,但遇到了一些令人沮丧的情况。一半的时间,我的功能按预期工作;我看到了所有预期的日志,并且数据库得到了正确更新。另一半时间,该功能几乎似乎中途停止;只出现了一些日志,并且只进行了预期的数据库更新的一半。我已经调试了很长一段时间,但我的想法已经不多了。

我在日志中一直看到的一件事是以下错误:

Function returned undefined, expected Promise or value

我不确定这个错误是否是导致上述不一致的原因,但这是我目前唯一的线索。此时,我已经注释掉了我的云函数中的几乎所有代码,并且错误似乎是由使用async.auto 函数引起的。一旦我删除对async 的任何引用,错误就会消失。

总结一下我的问题: 1 - 为什么使用async.auto 会导致上述错误? 2 - 错误是我的云功能运行结果不一致的原因吗?

作为参考,这是我现在过于简化且毫无意义的函数,它会引发上述错误:

exports.updateLeaderboard = functions.database.ref('/contests/{dateString}/ladder/dayIsComplete').onWrite((event, context) => {
    const isComplete = event.after._data,
        contestType = 'ladder',
        dateString = context.params.dateString;

    if (isComplete !== true) {
        console.warn(`${contestType} for ${dateString} is not yet complete.`);

        return false;
    }

    async.auto({
        fetchWinningPicks: cb => {
            return cb();
        },

        // ... Other stuff that I've now commented out

    }, err => {
        if (err) {
            return false;
        } else {
            return true;
        }
    });
};

【问题讨论】:

  • 错误消息是说您没有返回一个承诺(来自顶级函数),该承诺在所有异步工作完成后解决。你绝对不会那样做。我不知道这个 async 包应该为你做什么,但如果它不能以某种方式产生一个承诺,它就不太可能适合你。阅读有关终止函数的文档以获取更多信息。 firebase.google.com/docs/functions/terminate-functions
  • 感谢@DougStevenson 的快速回复。我想我已经说服自己 async.js 返回了一个承诺,但显然情况并非如此。我能够通过将async.auto 流包装在new Promise() 中并在我的最终回调中解决/拒绝来解决错误。

标签: javascript firebase firebase-realtime-database google-cloud-functions async.js


【解决方案1】:

我能够通过将我的 async.auto 流包装在 new Promise() 中并在我的最终回调中解决/拒绝来解决错误:

exports.updateLeaderboard = functions.database.ref('/contests/{dateString}/ladder/dayIsComplete').onWrite((event, context) => {
    const isComplete = event.after._data,
        contestType = 'ladder',
        dateString = context.params.dateString;

    if (isComplete !== true) {
        console.warn(`${contestType} for ${dateString} is not yet complete.`);

        return false;
    }

    return new Promise((resolve, reject) => {
        async.auto({
            fetchWinningPicks: cb => {
                return cb();
            },

            // ... Other stuff that I've now commented out

        }, err => {
            if (err) {
                reject();
            } else {
                resolve();
            }
        });
    });
};

这似乎解决了我上面的两个问题。

【讨论】:

    猜你喜欢
    • 2018-04-18
    • 2018-12-03
    • 2019-08-12
    • 1970-01-01
    • 1970-01-01
    • 2018-09-27
    • 2018-12-05
    • 2019-11-18
    • 1970-01-01
    相关资源
    最近更新 更多