【问题标题】:Can I make rest API for Unity with Firebase cloud functions and Firestore?我可以使用 Firebase 云功能和 Firestore 为 Unity 制作 REST API 吗?
【发布时间】:2020-04-11 12:34:38
【问题描述】:

我想为我的 Unity 游戏的 Firestore 数据库制作 rest api。 我不想直接连接数据库,因为游戏逻辑复杂,我想把应用逻辑控制在服务器端,避免客户端篡改。

所以我想通过云函数的每一个写入和每一个读取请求! 还好吗?

用云函数将函数写入Firestore数据库非常简单:

云功能 serverless nodejs index.js:

exports.helloWorld = functions.https.onCall((data, context) => {
   let data = {
       name: 'Los Angeless',
       state: 'CA',
       country: 'USA'
     };

     // Add a new document in collection "cities" with ID 'LA'
     let setDoc = db.collection('xy').doc(data.text).set(data);

     return { text : "ok" }  });

Unity c#:

   public void writeexample()
     {


         var data = new Dictionary<string, object>();
         data["text"] = “example”;
         data[“xy”] = “example”;

         FirebaseFunctions.DefaultInstance.GetHttpsCallable(“helloWorld”)
 .CallAsync(data).ContinueWith((task) =>
 {
 if (task.IsFaulted)
 {
           // Handle the error...
 }
 else if (task.IsCompleted)
 {

         // DataSnapshot snapshot = task.Result;

         IDictionary snapshot = (IDictionary)task.Result.Data;

         print(“Result:” + snapshot["text"]);

     }
 });

 }

效果很好。 但是如何读取数据库呢? (不是实时的,只有一次简单的查询。)

我读到这个:Call functions from your app - 云函数文档

还有这个:Get data once - Firestore 文档

但我不明白,如何通过云功能获取数据。 我不想触发,我想使用云函数作为休息 api。所以每次对 Firestore 数据库的读写都是通过云功能进行的。不可能吗?如果可能,怎么做?

谢谢!

【问题讨论】:

    标签: c# unity3d google-cloud-firestore google-cloud-functions


    【解决方案1】:

    是的,可以使用从 Firestore 返回数据的 Cloud Functions 创建 REST 端点。但我会考虑将其设为 HTTP 可调用函数,就像您当前的 helloWorld 函数已经是一样。 HTTP 可调用函数是常规 REST/HTTP(S) 函数的薄包装,这使得它们更容易从您的应用程序代码中调用。

    例如,要从 helloWorld 正在写入的集合中的文档中读取 name 字段,您可以在 Cloud Functions 中执行以下操作:

    exports.getNames = functions.https.onCall(async (data, context) => {
        let querySnapshot = await db.collection('xy').orderBy("name").limit(3).get();
        if (!querySnapshot.empty) {
          let names = querySnapshot.documents.map((doc) => doc.data().name);
          return names;  
        } 
        else {
          return [];
        }
    });
    

    然后,您可以从与 Unity 类似的构造中调用它:

    FirebaseFunctions.DefaultInstance.GetHttpsCallable(“getNames”)...
    

    【讨论】:

    • 嗯,我不知道.. 我试试这个:exports.getNames = functions.https.onCall(async (data, context) => { let querySnapshot = await db.collection('example ').get(); let names = querySnapshot.documents.map((doc) => doc.data().name); return names; }); Firebase 日志:未处理的错误 TypeError:无法在流程中的 处读取 exports.getNames.functions.https.onCall (/srv/index.js:80:41) 处未定义的属性“映射”(内部/流程/ next_tick.js:229:7) 我的 Firestore 数据库结构:示例集合 -> autoid -> 名称:示例
    • 在这种情况下,查询似乎没有结果。我更新了答案中的代码来处理这种情况。
    • 如果您是 JavaScript 新手,Cloud Functions for Firebase 并不是学习它的最佳方式。我建议先阅读Firebase documentation for Web developers 和/或阅读Firebase codelab for Web developer。它们涵盖了许多基本的 JavaScript、Web 和 Firebase 交互。您还可以在本地 Node.js 进程中使用 Admin SDK,该进程可以使用本地调试器进行调试。完成这些之后,您也可以更好地为 Cloud Functions 编写代码
    • 我得到结果,并映射问题。 exports.getNames = functions.https.onCall(async (data, context) => { let querySnapshot = await db.collection('xy').orderBy("name").limit(3).get(); if ( !querySnapshot.empty) { let names = querySnapshot.documents.map((doc) => doc.data().name); console.log("ok"); return names; } else { console.log("nook “); 返回 []; } });如果我创建 xy 集合,则记录:未处理的错误 TypeError:无法读取未定义的属性 'map' 如果我删除 xy 集合,则控制台日志:nook。
    猜你喜欢
    • 2020-07-07
    • 2018-05-09
    • 2019-11-18
    • 2021-12-04
    • 2020-03-22
    • 2018-05-26
    • 2018-11-22
    • 2018-06-30
    • 2021-04-28
    相关资源
    最近更新 更多