【问题标题】:flutter & firebase: writing successfully with error?颤振和火力:成功写入错误?
【发布时间】:2020-09-07 08:34:39
【问题描述】:

我有一些看似很奇怪的行为。我一直在关注多个关于将 Firebase 集成到我的 Flutter 应用中的教程。

我正在尝试做一些非常简单的事情。当用户按下按钮时,会创建一个“会话”文档。

我有这个index.js

const functions = require('firebase-functions');
const admin = require('firebase-admin');
admin.initializeApp(functions.config().firebase);

exports.addSession = functions.https.onCall((data, context) => {
    const sessions = admin.firestore().collection('sessions');
    return sessions.add({
        game: data['game'],
        rules: data['rules'],
        password: data['password'],
        roomCode: data['roomCode'],
        playerIds: data['playerIds']
    });
});

在 Flutter 中调用时,数据成功写入数据库(我可以在控制台看到),但我也总是出现这个错误: [VERBOSE-2:ui_dart_state.cc(157)] Unhandled Exception: PlatformException(functionsError, Firebase function failed with exception., {message: INTERNAL, code: INTERNAL})

当我检查 Firebase 日志时,我看到:

颤振调用:

final HttpsCallable callable =
        CloudFunctions.instance.getHttpsCallable(functionName: 'addSession');
    await callable.call(<String, dynamic>{
      'game': game,
      'rules': 'default',
      'password': password,
      'roomCode': _roomCode,
      'playerIds': [123456],
    });

对此非常困惑,maximum stack call size exceeded 结果似乎与此无关。这是非常简单的代码!

还想知道这是否与我遇到的阅读问题有关,我将在另一篇文章中询问。

【问题讨论】:

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


    【解决方案1】:

    问题是您从函数返回的内容。可调用函数将根据代码返回的内容生成对客户端的响应。该响应将被序列化为 JSON。您的代码返回一个使用 DocumentReference 解析的承诺,并且 DocumentReference 不能很好地序列化,因为它包含循环引用。

    您应该做的是向客户端返回一些明确且简单的内容。例如:

    exports.addSession = functions.https.onCall(async (data, context) => {
        const sessions = admin.firestore().collection('sessions');
        await sessions.add({
            game: data['game'],
            rules: data['rules'],
            password: data['password'],
            roomCode: data['roomCode'],
            playerIds: data['playerIds']
        });
        return { result: "OK" }
    });
    

    当然,您可以返回任何您认为更有帮助的内容。请注意,我在 JavaScript 中使用 async/await 同步税以使其更容易。 Promise 就像 dart 中的 Futures 一样工作。

    【讨论】:

    • 非常感谢!这有效(一旦我删除了await,它就会导致警告)
    • 我不希望这个函数在没有等待的情况下 100% 的工作。 add() 是异步的,需要时间来完成,然后函数才能返回其响应。它返回的承诺必须在返回响应之前解决。
    • 我会调查的!再次感谢。你有没有机会看看我的另一个问题?我觉得这是一个不起作用的最小示例。 stackoverflow.com/questions/61922315/…
    猜你喜欢
    • 2021-06-05
    • 2023-03-22
    • 2021-08-27
    • 2019-05-31
    • 2021-03-19
    • 2021-03-10
    • 2021-07-03
    • 2021-08-04
    • 2021-02-03
    相关资源
    最近更新 更多