flutter & firebase:写成功,有错误?

我有一些看似非常奇怪的行为。我一直在关注有关将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 日志时,我看到以下内容:

http://img4.mukewang.com/6309c32e0001671f24720558.jpg

颤动调用:


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


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


千巷猫影
浏览 82回答 1
1回答

富国沪深

问题在于您从函数返回的内容。可调用函数将根据代码返回的内容生成对客户端的响应。该响应将序列化为 JSON。您的代码返回一个使用 DocumentReference 解析的 promise,并且 DocumentReference 不能很好地序列化,因为它包含循环引用。相反,您应该做的是向客户端返回一些明确而简单的东西。例如:exports.addSession&nbsp;=&nbsp;functions.https.onCall(async&nbsp;(data,&nbsp;context)&nbsp;=>&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;const&nbsp;sessions&nbsp;=&nbsp;admin.firestore().collection('sessions'); &nbsp;&nbsp;&nbsp;&nbsp;await&nbsp;sessions.add({ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;game:&nbsp;data['game'], &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;rules:&nbsp;data['rules'], &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;password:&nbsp;data['password'], &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;roomCode:&nbsp;data['roomCode'], &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;playerIds:&nbsp;data['playerIds'] &nbsp;&nbsp;&nbsp;&nbsp;});&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;{&nbsp;result:&nbsp;"OK"&nbsp;} });当然,您可以返回任何您认为更有帮助的东西。请注意,我在JavaScript中使用了async/await synctax,以使其更容易。承诺就像飞镖中的未来一样工作。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

JavaScript