Функции Firebase на хостинге Firebase: 404 - PullRequest
0 голосов
/ 02 июня 2018

Я пытаюсь вызвать функции из приложения, но это не работает, и я получаю следующую ошибку из консоли:

index.esm.js: 402 ОПЦИИ https://us -central1-undefined.cloudfunctions.net / addMessage 404 () Не удалось загрузить https://us -central1-undefined.cloudfunctions.net / addMessage : Ответ на предварительный запрос не проходитпроверка контроля доступа: в запрашиваемом ресурсе отсутствует заголовок «Access-Control-Allow-Origin».Источник 'https://MYWEBADDRESS', следовательно, не имеет доступа.Ответ имеет HTTP-код состояния 404. Если непрозрачный ответ удовлетворяет вашим потребностям, установите режим запроса «no-cors», чтобы получить ресурс с отключенным CORS.

firebase.json:

{
  "database": {
    "rules": "database.rules.json"
  },
  "hosting": {
    "public": "public",
    "rewrites": [
      {
        "source": "**",
        "function": "addMessage"
      }
    ]
  },
  "functions": {
    "predeploy": [
      "npm --prefix $RESOURCE_DIR run lint"
    ],
    "source": "functions"
  }
}

index.js

const functions = require('firebase-functions');

const admin = require('firebase-admin');
admin.initializeApp();


exports.addMessage = functions.https.onCall((data, context) => {

    // Message text passed from the client.
    const text = data.text;

        // Checking attribute.
    if (!(typeof text === 'string') || text.length === 0) {
      // Throwing an HttpsError so that the client gets the error details.
      throw new functions.https.HttpsError('invalid-argument', 'The function must be called with ' +
          'one arguments "text" containing the message text to add.');
    }
    // Checking that the user is authenticated.
    if (!context.auth) {
      // Throwing an HttpsError so that the client gets the error details.
      throw new functions.https.HttpsError('failed-precondition', 'The function must be called ' +
          'while authenticated.');
    }

    // Saving the new message to the Realtime Database.
    return admin.database().ref('/messages').push({
      text: text
    }).then(() => {
      console.log('New Message written');
      // Returning the sanitized message to the client.
      return { text: sanitizedMessage };
    }).catch((error) => {
    // Re-throwing the error as an HttpsError so that the client gets the error details.
    throw new functions.https.HttpsError('unknown', error.message, error);
  });
});

мой скрипт в index.html

var addMessage = firebase.functions().httpsCallable('addMessage');
addMessage({text: "messageText"}).then(function(result) {
     var message = result.data.text;
     console.log(message);
});

Как я инициализирую Firebase:

  <script src="https://www.gstatic.com/firebasejs/5.0.4/firebase-app.js"></script>
  <script src="https://www.gstatic.com/firebasejs/5.0.4/firebase-auth.js"></script>
  <script src="https://www.gstatic.com/firebasejs/5.0.4/firebase-database.js"></script>
  <script src="https://www.gstatic.com/firebasejs/5.0.4/firebase-functions.js"></script>
    <script>
      // Initialize Firebase
      var config = {
        apiKey: "**",
        authDomain: "***",
        databaseURL: "***",
        storageBucket: "***",
      };
      firebase.initializeApp(config);
      var functions = firebase.functions();
    </script>

1 Ответ

0 голосов
/ 22 июля 2018

У меня была точно такая же проблема, я нашел ваш вопрос без ответа, но в конце концов сумел выяснить.

Как упомянул выше @Doug Stevenson в комментариях, проблема в том, что CloudURL функции, который вы видите, имеет undefined вместо идентификатора вашего проекта в качестве последней части субдомена url.

Причина, по которой он не определен, заключается в том, что идентификатор вашего проекта не является частью вашего исходного объекта конфигурации Firebase.Как и я, вы, вероятно, скопировали и вставили стартовый фрагмент из Firebase для JS SDK, но сделали это до того, как они включили в него идентификатор проекта.По какой-то причине, хотя идентификатор проекта теперь необходим для создания URL-адреса облачных функций, SDK не выдает ошибку / предупреждение, если вы его не включаете.

Все, что вам нужно сделать, это добавить следующее поле к вашему config объекту:

projectId: <YOUR_PROJECT_ID_HERE>

Тогда вы больше не должны видеть запросы 404.

...