【问题标题】:Firebase Cloud Functions: Wait until request.body is valid before updatingFirebase Cloud Functions:等到 request.body 有效后再更新
【发布时间】:2020-07-10 15:49:04
【问题描述】:

我对通过我的 webGL Unity 应用程序访问的 Cloud Functions 感到有些沮丧。我收到 2 个请求而不是一个,第一个请求始终未定义。因此,我的数据库向我的数组添加了 2 个元素,每次调用它们,一个完全为空,一个有效。

这是我的云功能,在 Unity 中测试时效果很好,但在我的托管站点运行时效果不佳。

export const addSavedMission = functions.https.onRequest(
    (request, response) => {
    response.set(
      "Access-Control-Allow-Origin",
      "https://myunity.web.app"
    );
    response.set("Access-Control-Allow-Headers", "*");
    response.set("Accept", "application/json");

    // update the array data
    admin
      .firestore()
      .doc("data/missionData")
      .update({
        missions: admin.firestore.FieldValue.arrayUnion(request.body),
      })
      .then(() => {
        response.status(200).json({ message: `Success` });
      })
      .catch((error) => {
        console.error(error);
        response.status(500).json({
          message: error,
        });
      });
});

这是我调用它的 Unity 代码

IEnumerator PostSavedData()
{
    string data = JsonUtility.ToJson(thisMission);

    string url = $"https://us-central1-app.cloudfunctions.net/addSavedMission";
    var request = new UnityWebRequest(url, "POST");
    byte[] bodyRaw = Encoding.UTF8.GetBytes(data);
    request.uploadHandler = new UploadHandlerRaw(bodyRaw);
    request.downloadHandler = new DownloadHandlerBuffer();

    request.SetRequestHeader("Access-Control-Allow-Methods", "POST");
    request.SetRequestHeader("Content-Type", "application/json");
    request.SetRequestHeader("Access-Control-Allow-Headers", "*");
    request.SetRequestHeader("Access-Control-Allow-Origin", "https://myunity.web.app");

    yield return request.SendWebRequest();
    if (request.isNetworkError)
    {
        Debug.Log("Error: " + request.error);
    }
    else
    {
        Debug.Log("Status Code: " + request.responseCode);           
    }

}

当我从我的托管应用程序中发出此 POST 请求时,我会注销传入的 request.rawBody,第一个始终未定义,但第二个有效。

我在这里缺少什么?我确定 1 个 POST 有 2 个传入请求。

我尝试检查 request.rawBody !== 是否未定义,并且仅当它没有处理 firestore 更新但它永远不会处理第二个有效请求

【问题讨论】:

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


    【解决方案1】:

    第一个请求可能是cors pre-flight request。它不会包含请求的实际数据。这只是 cors 协议的要求。

    如果您在 Cloud Function 中使用 nodejs cors module 以便它自动处理第一个请求,管理 cors 会更容易。

    const cors = require('cors')({origin: true});
    
    export const addSavedMission = functions.https.onRequest(
        (request, response) => {
        cors(request, response, () => {
            // your function code here
        })
    });
    

    【讨论】:

    • 明白,谢谢。只是为了学习,有没有一种方法可以在不使用 cors 的情况下忽略我的云功能中的第一个请求?
    • 当然,您可以尝试在代码中检测它,但我认为让 cors 模块正确处理它会更好。
    • 我尝试并成功检测到它,但无法弄清楚如何忽略它。无论如何,使用 cors 是解决方案,谢谢
    • 你不能忽略它——你必须至少发送一个响应来终止函数,并告诉客户端使用 cors 是可以的。这就是该模块将为您做的事情。
    猜你喜欢
    • 2020-05-31
    • 2019-03-20
    • 2022-10-13
    • 2018-01-19
    • 2017-07-06
    • 1970-01-01
    • 1970-01-01
    • 2017-08-08
    • 1970-01-01
    相关资源
    最近更新 更多