Firebase 函数“无法确定后端规范”

问题描述 投票:0回答:1

我开始间歇性地收到此错误

⬢函数:无法从源加载函数定义: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 秒超时内的函数代码。

node.js firebase google-cloud-functions firebase-tools
1个回答
0
投票

我相信我已经找到了问题的根源和解决方法,尽管这应该在 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 路由本地流量或任何其他异常网络配置,或者可能是异常函数代码中的文件/目录权限等

© www.soinside.com 2019 - 2024. All rights reserved.