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



我正在尝试重用现有的Express应用程序,并将其移植到Firebase函数中。我有一个这样的项目结构:

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

/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

/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)

使用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","状态":{"代码":3,"消息":"函数加载用户代码时失败。错误消息:错误:请检查函数日志以查看错误原因: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","resourceName":"projects/xxxx/locations/us-central1/functions/应用程序"}

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

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

基本上把代码放进去/src/app/index.js它就可以工作了。似乎在使用不同文件夹中的代码时遇到问题?也许我在文档中遗漏了一些内容,但我必须指定它应该包含哪些目录吗?

我在目录中的package.json/functions/expresscors依赖项。

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

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

1. 创建指向我的应用程序的✅符号链接

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

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

2. 从我的应用程序❌创建本地模块

这种方法行不通。我修改了目录中/functionspackage.json,因此包括我的主要应用程序:

"dependencies: {
...
"app": "file://.."
...
}

然后像这样改变/functions/index.jsconst app = require('../src/app') → const app = require('app'). 但是,这并不能解决问题,因为Firebase仅上传functions/目录,不会上传我的应用程序。

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

当 Firebase CLI 部署您的代码时,它只会使用"functions"文件夹中的文件。 它不会部署除此之外的任何内容。 您的"src"文件夹位于外部,因此不会部署。

您需要将"src/app/index.js"移动到函数文件夹中的某个位置,并更改require以指向它。 或者,您需要以某种方式创建一个模块,当 package.json 未在本地运行时,该模块可以被 package.json 找到。

相关内容

  • 没有找到相关文章

最新更新