Почему функция onCall firebase вызывается дважды для одного вызываемого вызова клиента? - PullRequest
0 голосов
/ 22 февраля 2020

Мой код на стороне клиента вызывает функцию только один раз, но в журналах сервера он показывает два отдельных вызова. Впрочем, первая из каждой пары фактически не обрабатывает мой серверный код - это ожидаемое поведение?

Функция onCall:

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

exports.test = functions
    .region('asia-northeast1')
    .https
    .onCall(async (data, context) => {

        console.log('function test: start')

        if (!context.auth) {
            console.log('function test: throwing permission-denied');
            throw new functions.https.HttpsError('permission-denied', 'Mysterious');
        }

        console.log('function test: no error, user authorised');

    });

Клиент HTML:

<!DOCTYPE html>
<html>

<head>
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <title>Test</title>

    <script defer src="/__/firebase/7.7.0/firebase-app.js"></script>
    <script defer src="/__/firebase/7.7.0/firebase-auth.js"></script>
    <script defer src="/__/firebase/7.7.0/firebase-firestore.js"></script>
    <script defer src="/__/firebase/7.7.0/firebase-messaging.js"></script>
    <script defer src="/__/firebase/7.7.0/firebase-storage.js"></script>
    <script defer src="/__/firebase/7.7.0/firebase-functions.js"></script>

    <script defer src="/__/firebase/init.js"></script>

</head>

<body>
    <script src="app.js"></script>

    <button onclick="login()">
          Login with Google
      </button>

    <button onclick="logout()">
          Log out
      </button>

    <button onclick="test()">
          test
      </button>

</body>

</html>

Клиент JS:

var user, app, functions, callableTest;

document.addEventListener("DOMContentLoaded", async event => {
    app = firebase.app();
    functions = app.functions('asia-northeast1');
    callableTest = functions.httpsCallable('test');
    user = await firebase.auth().currentUser;
    console.log('user: ' + user);
});

async function login() {
    user = await firebase.auth().signInWithPopup(new firebase.auth.GoogleAuthProvider());
}

async function logout() {
    await firebase.auth().signOut();
    user = null;
}

async function test() {
    console.log('calling test function');
    await callableTest();
    console.log('returned from test function');
}

Это журналы для [тестового] ​​клика перед предварительным входом, затем [войти в систему ..], затем [тестировать] снова:

Изображение бревен

D 2020-02-22T04:08:27.209014265Z test 7whrcrhllsa8 Function execution took 5 ms, finished with status code: 403 test 7whrcrhllsa8 
I 2020-02-22T04:08:27.208Z test 7whrcrhllsa8 function test: throwing permission-denied test 7whrcrhllsa8 
I 2020-02-22T04:08:27.208Z test 7whrcrhllsa8 function test: start test 7whrcrhllsa8 
D 2020-02-22T04:08:27.205019518Z test 7whrcrhllsa8 Function execution started test 7whrcrhllsa8 
D 2020-02-22T04:08:27.072797567Z test 7whrdta870ib Function execution took 42 ms, finished with status code: 204 test 7whrdta870ib 
D 2020-02-22T04:08:27.031343424Z test 7whrdta870ib Function execution started test 7whrdta870ib 
D 2020-02-22T04:07:39.540689974Z test 7whryp7xojaf Function execution took 87 ms, finished with status code: 403 test 7whryp7xojaf 

1 Ответ

1 голос
/ 22 февраля 2020

Вызов с кодом состояния 204 является результатом предварительного запроса CORS , когда запрос поступает с веб-страницы (что в вашем случае). Вызываемые функции автоматически обрабатывают CORS , поэтому все это происходит без вашего вмешательства.

Это задокументировано в протоколе spe c для вызываемых функций .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...