Firebase 函数部署失败并需要外部代码

use*_*783 1 javascript node.js express firebase google-cloud-functions

我正在尝试重用现有的 Express 应用程序,并将其基本上移植到 firebase 功能。我有一个这样的项目结构:

/
  functions/
    index.js
    package.json
  src/
    app/
      index.js
  index.js

Run Code Online (Sandbox Code Playgroud)

/src/app/index.js

const express = require('express')
const cors = require('cors')

const app = express()

app.use(cors({
  origin: 'http://localhost:5000',
}))

app.get('/health', (req, res) => {
  res.status(200).send('Health OK')
})

module.exports = app
Run Code Online (Sandbox Code Playgroud)

/functions/index.js

const functions = require('firebase-functions');
const admin = require('firebase-admin')

const app = require('../src/app')

admin.initializeApp()
exports.app = functions.https.onRequest(app)
Run Code Online (Sandbox Code Playgroud)

使用时整个设置运行良好firebase emulators:start。我可以调用这些函数,一切正常。但是,当我收到以下错误消息时,我无法部署这些功能:

函数加载用户代码失败。错误消息:错误:请检查您的函数日志以查看错误原因: https: //cloud.google.com/functions/docs/monitoring/logging#viewing_logs其他故障排除文档可以在https://cloud.google.com/functions/docs/troubleshooting#logging中找到

函数部署有以下函数错误:app

当我在 Firebase 控制台中查看日志时,我无法查明确切的问题:

{"@type":"type.googleapis.com/google.cloud.audit.AuditLog","status":{"code":3,"message":"加载用户代码时函数失败。错误消息:错误:请检查您的函数日志以查看错误原因: https: //cloud.google.com/functions/docs/monitoring/logging#viewing_logs。可以在https://cloud.google.com/functions/找到其他故障排除文档docs/troubleshooting#logging"},"authenticationInfo":{"principalEmail":"xxx@gmail.com"},"serviceName":"cloudfunctions.googleapis.com","methodName":"google.cloud.functions.v1 .CloudFunctionsService.UpdateFunction","re​​sourceName":"projects/xxxx/locations/us-central1/functions/app"}

但是,当我从/functions/index.js文件中删除这一行时:

const app = require('../src/app')
Run Code Online (Sandbox Code Playgroud)

基本上把代码放进去就/src/app/index.js可以了。使用不同文件夹中的代码似乎有问题?也许我错过了文档中的某些内容,但是我是否必须指定它应该包含哪些目录?

我在in目录中有express依赖项。corspackage.json/functions/

use*_*783 5

道格·史蒂文森的回答很好地解释了我的问题。我不知道这个“限制”(或功能?)。

\n

我最终尝试了两种不同的方法:

\n

1. 创建到我的应用程序 \xe2\x9c\x85 的符号链接

\n

在我的functions/目录中,我创建了一个指向我的应用程序的符号链接:\n ln -s ../src ./src,然后functions/index.js像这样更改了路径const app = require(\'../src/app\') \xe2\x86\x92 const app = require(\'./src/app\')

\n

我能够通过模拟器套件对此进行测试,并且该函数也成功部署,并且我能够调用已部署的函数。

\n

2. 从我的应用程序 \xe2\x9d\x8c 创建本地模块

\n

这种方法没有奏效。我修改了package.jsonin/functions目录,以便包含我的主要应用程序:

\n
"dependencies: {\n  ...\n  "app": "file://.."\n  ...\n}\n
Run Code Online (Sandbox Code Playgroud)\n

然后像/functions/index.js这样进行更改const app = require(\'../src/app\') \xe2\x86\x92 const app = require(\'app\')。\n但这并不能解决问题,因为 Firebase 仅上传functions/目录,而不会上传我的应用程序。

\n

我想一种方法是实际创建我的应用程序的已发布模块,然后 Firebase 会安装它。我没有这样做,因为我真的不想发布我的应用程序。但这是一种方式。

\n