我已经使用
部署了一个可调用函数,例如foo
firebase deploy --only functions:foo
在Flutter中使用:
var result = await FirebaseFunctions.instance.httpsCallable('foo')();
var data = result.data;
所有的好。但我想在Firebase模拟器中运行这个功能。当我运行
firebase emulators:start --only functions
我可以看到模拟器启动并运行,并且我正在使用
将我的Flutter应用程序连接到模拟器:FirebaseFunctions.instance.useFunctionsEmulator('localhost', 4000);
然而,我不知道如何使用Firebase模拟器在Flutter中调用可调用的foo
。我看到了这个相关的帖子,但它并没有真正回答我的问题。
下面是控制台输出:
✔ functions[us-central1-foo]: http function initialized (http://localhost:5001/my_project/us-central1/foo).
┌─────────────────────────────────────────────────────────────┐
│ ✔ All emulators ready! It is now safe to connect your app. │
│ i View Emulator UI at http://localhost:4000 │
└─────────────────────────────────────────────────────────────┘
┌───────────┬────────────────┬─────────────────────────────────┐
│ Emulator │ Host:Port │ View in Emulator UI │
├───────────┼────────────────┼─────────────────────────────────┤
│ Functions │ localhost:5001 │ http://localhost:4000/functions │
├───────────┼────────────────┼─────────────────────────────────┤
│ Firestore │ localhost:8080 │ http://localhost:4000/firestore │
└───────────┴────────────────┴─────────────────────────────────┘
Emulator Hub running at localhost:4400
Other reserved ports: 4500
我试着
useFunctionsEmulator('localhost', 4000);
useFunctionsEmulator('localhost', 5001);
但两者都抛出以下错误调用httpsCallable('foo')
,但没有模拟器,这个函数确实工作。
[ERROR:flutter/lib/ui/ui_dart_state.cc(209)] Unhandled Exception: [firebase_functions/unavailable] unavailable
我怀疑您的主机和端口值可能不正确。当您启动模拟器时,日志将显示各种模拟器正在使用的所有端口。还有firebase.json
文件,其中包含模拟器的端口配置。
同样,localhost
不会被客户端自动识别。对于Android,您可能必须通过创建网络安全配置xml在清单中配置networkSecurityConfig
。对于iOS,我认为应该有一些东西需要在plist
文件中添加-必须检查确认。
一旦您的客户端能够访问localhost
(隐式或显式),您就可以连接到您的模拟函数。例如,我在代码中显式地声明了主机值(这在重新启动时不会改变)。
functions = FirebaseFunctions.getInstance()
/*
* Emulator
* */
if (emulatorMode) { //Local Testing
functions.useEmulator("10.0.2.2", 5001)
} else { //Live
functions = Firebase.functions
}
// Call the function and extract the operation from the result
return functions
.getHttpsCallable(function)
.call(inputData)
.continueWith { task ->...
这对我来说似乎不是端口或设置问题。您的控制台似乎显示了预期的输出。
试试这个:
在Flutter内部,在要调用函数的地方,添加:
http.get(Uri.parse('http://localhost:5001/my_project/us-central1/foo'))
你必须设置一个env
变量,它要求你的应用程序检查它所处的环境。如果dev
,那么它应该使用上面的url,如果prod
,它可以使用prod
的url
this._cloudFunctions = FirebaseFunctions.instance;
_cloudFunctions.useFunctionsEmulator(origin: "http://<System's IP>:5001");
输入ipconfig可以获得系统ip在命令提示符中。请确保您已连接ip并运行模拟器启动。
For Flutter
根据Firebase Flutter文档-有一个useFunctionsEmulator
模块作为你的Firebase函数实例的一部分。
你可以这样初始化它:
FirebaseFunctions.instance.useFunctionsEmulator('localhost', 5001);
Web如果您将cd
放入functions目录您可以运行npm start
,默认情况下,它将在shell中本地构建和运行模拟器。我发现这是本地测试可调用函数的唯一解决方案。
firebase团队在V9模块化SDK中提供了一个connectFunctionsEmulator
子模块,专门用于与本地应用程序交互。
你可以在这里查看官方文档。
运行npm run serve
将服务于您所期望的模拟器,但我一直在通过url测试可调用函数。