Облачные функции Firebase: перед обновлением дождитесь, пока request.body станет действительным. - PullRequest
1 голос
/ 10 июля 2020

Я немного разочарован облачными функциями, доступными через мое приложение webGL Unity. Я получаю 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 из своего размещенного приложения, я выхожу из входящего запроса. RawBody и первый всегда не определен, но второй действителен.

Что мне здесь не хватает? Я уверен, что есть 2 входящих запроса от 1 POST.

Я пытался проверить, не определено ли request.rawBody! == undefined, и только если он не обрабатывает обновление firestore, но тогда это просто никогда обрабатывает 2-й действительный запрос

1 Ответ

1 голос
/ 10 июля 2020

Первым запросом, вероятно, будет предполетный запрос . Он не будет содержать фактических данных запроса. Это просто требуется протоколом cors.

Управлять cors будет проще, если вы используете модуль nodejs cors в своей облачной функции, чтобы он автоматически обрабатывал первый запрос.

const cors = require('cors')({origin: true});

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