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