Unity Firebase functions.https.onRequest调用错误始终为内部错误,并显示错误消息:响应不是有效的JSON对象
我试图在Unity中处理Firebase云函数错误,但我不能总是收到错误代码为“Internal”且错误消息为“Response is not valid JSON object”的错误 在阅读Firebase文档和其他一些堆栈溢出问题后,我了解到functions.https.onCall和functions.https.onRequest之间存在差异。我们目前正在使用onRequest,因为除了android和iOS之外,我们还需要从web访问这些功能 问题云代码:Unity Firebase functions.https.onRequest调用错误始终为内部错误,并显示错误消息:响应不是有效的JSON对象,firebase,unity3d,google-cloud-functions,Firebase,Unity3d,Google Cloud Functions,我试图在Unity中处理Firebase云函数错误,但我不能总是收到错误代码为“Internal”且错误消息为“Response is not valid JSON object”的错误 在阅读Firebase文档和其他一些堆栈溢出问题后,我了解到functions.https.onCall和functions.https.onRequest之间存在差异。我们目前正在使用onRequest,因为除了android和iOS之外,我们还需要从web访问这些功能 问题云代码: app.post("/t
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');
});
'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');
});
统一代码:
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
完整(相关)云代码:
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');
});
'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');
});
“严格使用”;
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')();
常量app=express();
admin.initializeApp();
const VALIDATEFIREASEIDTOKEN=异步(请求、恢复、下一步)=>{
if((!req.headers.authorization | |!req.headers.authorization.startsWith('Bearer'))&&
!(请求cookies和请求cookies.\uuu会话)){
console.error('授权标头中没有作为承载令牌传递Firebase ID令牌。',
'请确保通过提供以下HTTP标头来授权您的请求:',
“授权:持票人”,
'或通过传递一个“uu会话”cookie.”);
res.status(403).发送(“未授权”);
返回;
}
让idToken;
if(req.headers.authorization&&req.headers.authorization.startsWith('Bearer')){
//从授权标头读取ID令牌。
idToken=req.headers.authorization.split('Bearer')[1];
}else if(请求cookies){
//从cookie中读取ID令牌。
idToken=请求cookies.\uuuu会话;
}否则{
//没有饼干
res.status(403).发送(“未授权”);
返回;
}
试一试{
const decodedIdToken=wait admin.auth().verifyIdToken(idToken);
req.user=decodedIdToken;
next();
返回;
}捕获(错误){
console.error('验证Firebase ID令牌时出错:',错误);
res.status(403).发送(“未授权”);
返回;
}
};
应用程序使用(cors);
应用程序使用(cookieParser);
应用程序使用(ValidateFireBaisedToken);
应用程序发布(“/test)”,(请求、回复)=>{
res.status(500).send(“此消息将永远不会出现在编辑器中”);
});
exports.ThisTestFails=functions.https.onRequest(app);
exports.ThisTestWorks=functions.https.onCall((数据、上下文)=>{
抛出新函数.https.HttpsError('invalid-argument','此消息将出现在编辑器中');
});
在Unity编辑器中这不会返回自定义错误是有原因的吗?我错过了什么
提前谢谢