在我的PWA上,有一些函数由onCall函数运行。它工作正常,但几天前,这些功能中的任何一个都在返回";Firebase错误:内部";仅当PWA在具有4g网络的移动设备上运行时。在Wifi网络中,一切都按预期运行。
一些额外信息:
- 在4g中时,函数返回错误,但在firebase控制台上没有任何消息日志。甚至";函数执行开始";或";函数执行耗时"显示
- 是的,我的4g是可以的。尽管onCall函数出现了错误,但其他需要连接的部分运行良好(例如:来自SDK firebase的任何数据库调用(
- 这不是我的设备的特定问题。在一些设备中它可以工作,在另一些设备中不…我用IOS或Android的不同设备进行了测试
我的代码-Web:
async checkFirstLogin(uid) {
this.apiPortal = this.functions.httpsCallable('apiPortal')
let body = {
action: 'checkFirstLogin',
uid: uid
}
return this.apiPortal({body: body})
.then((response) => {
return response.data.success
}).catch((e) => {
console.log('========> Error', e) //returns "Firebase error: internal"
})
}
我的代码功能
const admin = require('firebase-admin');
const functions = require('firebase-functions');
try {
admin.initializeApp();
} catch (e) {}
const runtimeOpts = {
timeoutSeconds: 60,
memory: '2GB'
}
exports.default = functions.region('southamerica-east1').runWith(runtimeOpts).https.onCall((data, context) => {
if (!context.auth) {
return {
status: 'error',
code: 401,
message: 'Not signed in'
}
}
functions.logger.log(`#apiPortal - starting - action:${data.body.action}`)
if (data.body.action==='checkFirstLogin') {
let ref = admin.database().ref(`login/${data.body.uid}`)
return ref.once('value').then((data) => {
if (data.val()) {
let usr = data.val()
return {success: true, data: usr.hasOwnProperty('last_login')}
} else {
return {success: true, data: null}
}
}).catch((e) => {
throw new functions.https.HttpsError('Unknown error', e.message, e)
})
} else {
return {success: false, data: null}
}
}
})
我们发现问题特别出在TIM 4g网络上。这是他们的DNS问题,没有解决我们在GCP中的API的url。今天,在经历了3天的问题后,又开始工作了
我面临着完全相同的问题,我找到的唯一解决方法是使用firebase托管来创建函数的可重写路径。这是一个解决方案,因为firebase主机不受TIM 4g网络这种极其恼人的行为的影响(在我和@leandro-furini的情况下(。
如何:
-
使用firebase宿主发布网站(如果你已经有了,你可以使用它,否则你可以发布一个虚拟网站(。
-
在网站项目中的firebase.json文件中,您需要为函数放置重写指令,如下所示:
{
...
"rewrites": [
{
"source": "myFunctionPath", // the name you want to give to the path
"function": "nameOfMyFunction" // the name of your function in the firebase
},
]
}
并使用firebase cli部署您的网站:firebase deploy--仅托管
- 更改您的firebase sdk(在我的情况下,我使用AngularFire(以使用不同的来源,在这种情况下,来源必须是firebase托管网站地址,例如:https://my-app.web.app(这也适用于在firebase主机上添加的自定义域(
@NgModule({
declarations: [
AppComponent
],
imports: [
BrowserModule.withServerTransition({ appId: 'serverApp' }),
AppRoutingModule,
LayoutModule,
SwiperModule,
AngularFireModule.initializeApp(environment.firebase),
NgcCookieConsentModule.forRoot(cookieConfig),
SweetAlert2Module.forRoot(),
NgxMaskModule.forRoot()
],
providers: [
ScreenTrackingService, UserTrackingService, AngularFireAuthGuard,
//{ provide: REGION, useValue: 'southamerica-east1' },
//{ provide: USE_FUNCTIONS_EMULATOR, useValue: ['localhost', 5001] },
{ provide: LOCALE_ID, useValue: 'pt' },
{ provide: ORIGIN, useValue: 'https://my-app.web.app' } // ** HERE GOES YOUR HOSTIN ADDRESS **
],
bootstrap: [AppComponent]
})
export class AppModule { }
这个片段来自AngularFire的Angular,但我100%确信可以使用原生firebasesdk配置可调用函数的来源。
- 确保您的云功能发布在us-central1区域(仅适用于此区域(
就是这样!!现在,当您从pwa调用一个可调用函数时地址将是:
https://my-app.web.app/myFunctionPath
并将达到与调用相同的结果
https://us-central1-my-project.cloudfunctions.net/nameOfMyFunction