我开始间歇性地收到此错误
⬢函数:无法从源加载函数定义:FirebaseError:用户代码加载失败。无法确定后端规格
启动模拟器时。互联网上的报告推测了各种各样的事情,但尚不清楚根本原因,因此我一直在不断重新启动,直到不再抛出错误为止。现在,100%的时间我的发展都戛然而止。经过几个小时的切换,进入各种猜测和检查的兔子洞,我不知所措。
firebase-工具版本:
$ firebase --version
13.17.0
这是
functions/index.js
的最小可重现版本:
const admin = require("firebase-admin/app");
admin.initializeApp();
const functions = require("firebase-functions/v1");
exports.created = functions.auth.user().onCreate(async (user) => {
const email = user.email;
console.log(email);
return;
});
还有
functions/package.json
的内容:
{
"name": "functions",
"description": "Cloud Functions for Firebase",
"scripts": {
"lint": "eslint .",
"serve": "firebase emulators:start --only functions",
"shell": "firebase functions:shell",
"start": "npm run shell",
"deploy": "firebase deploy --only functions",
"logs": "firebase functions:log"
},
"engines": {
"node": "18"
},
"main": "index.js",
"private": true,
"dependencies": {
"firebase-admin": "^12.4.0",
"firebase-functions": "^6.0.1",
"nodemailer": "^6.9.15"
}
}
当使用
--debug
标志启动模拟器时,这会出现在日志中的错误之前:
Failed to find version of module node: reached end of search path src/functions/node_modules
✔ functions: Using node@18 from host.
Could not find functions.yaml. Must use http discovery
Found firebase-functions binary at 'src/functions/node_modules/.bin/firebase-functions'
Serving at port 8872
⬢ functions: Failed to load function definition from source: FirebaseError: User code failed to load. Cannot determine backend specification
更新: 经过进一步调试,似乎当模拟器启动时,它尝试通过以下方式提供功能代码:
node src/functions/node_modules/.bin/firebase-functions src/functions
我目前最好的猜测是,
firebase-tools
中存在一个错误,它不再创建functions.yaml(可能是过去版本的工件),或者在firebase-functions
中,节点由于某种原因崩溃,因此无法服务firebase-tools
预期的 10 秒超时内的函数代码。
我相信我已经找到了问题的根源和解决方法,尽管这应该在 Firebase 方面真正解决。
我使用 WSL2 在 Windows 上进行开发;我的函数代码驻留在 Windows 上,我使用 vscode + WSL 在 WSL2-Ubuntu 上进行开发。 Linux中模拟的/mnt/访问Windows端的代码比原生Linux文件系统慢。这会导致庞大的文件系统操作比配备 SSD 的现代计算机花费更长的时间。
firebase-tools
的模拟器启动 firebase-functions
来加载您的函数代码,并且在内部允许 firebase-functions
最多需要 10 秒来完成工作并做出响应。
firebase-functions
似乎正在做一件需要比人们预期更长的时间才能完成工作的事情。计时器有效启动:
Serving at port XXXX
并已完成:
✔ functions: Loaded functions definitions from source: ...
或10秒后失败:
⬢ functions: Failed to load function definition from source: ...
我的解决方法是将我的代码移动到“本地”WSL2-Ubuntu 文件系统。这使得
firebase-functions
能够在 10 秒的截止时间内完成工作。
我希望 Firebase 在这里修复的是:
firebase-tools
中的 10 秒超时,因为完全失败肯定不如在 10 秒内提供响应firebase-functions
加载代码的关键路径的效率...我猜它可能对提供给它的 node-modules
路径内的大量 src/functions
文件夹做了一些不必要的事情。我为此浪费了 5 天的开发时间;我希望所有这些线索可以为下一个人节省一些调试时间。如果较慢的文件系统 I/O 不适用于您的环境,请考虑可能影响
firebase-functions
在其端口上及时响应的任何其他因素,例如 VPN 路由本地流量或任何其他异常网络配置,或者可能是异常函数代码中的文件/目录权限等