首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么一个可调用的客户机调用两次onCall firebase函数?

为什么一个可调用的客户机调用两次onCall firebase函数?
EN

Stack Overflow用户
提问于 2020-02-22 13:37:34
回答 1查看 211关注 0票数 1

我的客户端代码只调用该函数一次,但在服务器日志上显示了两次单独的调用。但是,每对代码中的第一个似乎并没有实际处理我的服务器端代码--这是预期的行为吗?

onCall函数:

代码语言:javascript
复制
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:

代码语言:javascript
复制
<!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:

代码语言:javascript
复制
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');
}

这些是用于测试的日志,单击pre-login,然后登录..,然后再次测试:

Image of logs

代码语言:javascript
复制
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 
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-02-22 13:42:19

状态代码为204的调用是当请求来自网页(在您的示例中)时CORS pre-flight request的结果。可调用函数会自动处理CORS安全性,因此所有这些都无需您的干预即可实现。

protocol spec for callable functions中记录了这一点。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60349364

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档