Javascript Firebase云功能:在更新之前,请等待request.body有效

Javascript Firebase云功能:在更新之前,请等待request.body有效,javascript,firebase,unity3d,google-cloud-firestore,google-cloud-functions,Javascript,Firebase,Unity3d,Google Cloud Firestore,Google Cloud Functions,我对通过我的webGL Unity应用程序访问云功能感到有些失望。我收到2个请求,而不是一个,第一个总是未定义的。因此,我的数据库向数组中添加了两个元素,每个元素调用一个完全空,一个有效 这是我的云功能,当从Unity进行测试时,它可以完美地工作,但当从我的托管站点运行时,它就不能工作了 export const addSavedMission = functions.https.onRequest( (request, response) => { response.se

我对通过我的webGL Unity应用程序访问云功能感到有些失望。我收到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,
        });
      });
});
这是我的统一代码,称之为

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,第一个总是未定义的,但第二个是有效的

我错过了什么?我确信有2个来自1个帖子的请求


我已尝试检查request.rawBody!==未定义,且仅当它未处理firestore更新,但从未处理第二个有效请求时,第一个请求可能是一个错误。它将不包含请求的实际数据。这只是cors协议的要求

如果您在云中使用函数中的,那么管理COR将更容易,这样它将自动处理第一个请求

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。这就是模块将为您做的。