Unity Firebase functions.https.onRequest ошибка вызова всегда внутренняя с сообщением об ошибке: Ответ не является допустимым объектом JSON - PullRequest
0 голосов
/ 26 февраля 2019

Я пытаюсь обработать ошибки облачной функции Firebase в Unity, но не всегда могу получить ошибку с кодом ошибки «Внутренний» и сообщением об ошибке «Ответ не является допустимым объектом JSON.»

После прочтенияДокументация по Firebase и некоторые другие вопросы переполнения стека. Я понимаю, что есть разница между functions.https.onCall и functions.https.onRequest.В настоящее время мы используем onRequest, потому что нам нужно получить доступ к этим функциям из Интернета, в дополнение к Android и iOS.

Код проблемного облака:

app.post("/test", (req, res) => {
    res.status(500).send("This message will never appear in the editor");
});

exports.app = functions.https.onRequest(app);

exports.ThisTestWorks = functions.https.onCall((data, context) => {
    throw new functions.https.HttpsError('invalid-argument', 'This message will appear in the editor');
});

Код Unity:

FirebaseProcess retVal = new FirebaseProcess();
FunctionInst.GetHttpsCallable("app/test").CallAsync(request).ContinueWith(t => {
    if (t.IsFaulted || t.IsCanceled) {
        foreach (var inner in t.Exception.InnerExceptions) {
            if (inner is FunctionsException) {
                var e = (FunctionsException) inner;
                Debug.Log("e.ErrorCode: " + e.ErrorCode + ", e.Message: " + e.Message);
            } else {
                Debug.Log("inner.Message: " + inner.Message);
            }
        }
        Debug.Log("t.Exception.Message " + t.Exception.Message);
        Debug.Log("t.Status " + t.Status);

    } else {
        retVal.Success = true;
        retVal.ResultJSON = t.Result.Data as string;
    }
    retVal.IsRunning = false;
});

Этот код вернет следующие журналы:

e.ErrorCode: Internal, e.Message: Response is not valid JSON object.
t.Exception.Message One or more errors occurred.
t.Status Faulted

Полный (соответствующий) облачный код:

'use strict';

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

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

const express = require('express');
const cookieParser = require('cookie-parser')();
const app = express();

admin.initializeApp();

const validateFirebaseIdToken = async (req, res, next) => {

    if ((!req.headers.authorization || !req.headers.authorization.startsWith('Bearer ')) &&
        !(req.cookies && req.cookies.__session)) {
        console.error('No Firebase ID token was passed as a Bearer token in the Authorization header.',
            'Make sure you authorize your request by providing the following HTTP header:',
            'Authorization: Bearer <Firebase ID Token>',
            'or by passing a "__session" cookie.');
        res.status(403).send('Unauthorized');
        return;
    }

    let idToken;
    if (req.headers.authorization && req.headers.authorization.startsWith('Bearer ')) {
        // Read the ID Token from the Authorization header.
        idToken = req.headers.authorization.split('Bearer ')[1];
    } else if(req.cookies) {
        // Read the ID Token from cookie.
        idToken = req.cookies.__session;
    } else {
        // No cookie
        res.status(403).send('Unauthorized');
        return;
    }

    try {
        const decodedIdToken = await admin.auth().verifyIdToken(idToken);
        req.user = decodedIdToken;
        next();
        return;
    } catch (error) {
        console.error('Error while verifying Firebase ID token:', error);
        res.status(403).send('Unauthorized');
        return;
    }
};

app.use(cors);
app.use(cookieParser);
app.use(validateFirebaseIdToken);

app.post("/test", (req, res) => {
    res.status(500).send("This message will never appear in the editor");
});

exports.ThisTestFails = functions.https.onRequest(app);

exports.ThisTestWorks = functions.https.onCall((data, context) => {
    throw new functions.https.HttpsError('invalid-argument', 'This message will appear in the editor');
});

Существует ли причина, по которой это не возвращает пользовательскую ошибкув редакторе Unity?Что мне здесь не хватает?

Заранее спасибо!

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