繁体   English   中英

Firebase function 部署失败,需要外部代码

[英]Firebase function deploy fails with requiring external code

我正在尝试重新使用现有的 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时,整个设置运行良好。 我可以调用函数,一切正常。 但是,当我收到此错误消息时,我无法部署这些功能:

Function 加载用户代码失败。 错误消息:错误:请检查您的 function 日志以查看错误原因: 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":"加载用户代码时函数失败。错误消息:错误:请检查您的 function 日志以查看错误原因: https://cloud.google.com/functions/docs/monitoring/logging#viewing_logs 。可以在https://cloud.google.com/functions/找到其他故障排除文档文档/故障排除#logging"},"authenticationInfo":{"principalEmail":"xxx@gmail.com"},"serviceName":"cloudfunctions.googleapis.com","methodName":"google.cloud.functions.v1 .CloudFunctionsService.UpdateFunction","resourceName":"projects/xxxx/locations/us-central1/functions/app"}

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

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

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

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

Doug Stevenson的回答很好地解释了我的问题。 我不知道这个“限制”(或功能?)。

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

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

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

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

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

这种方法没有用。 我修改了/functions目录中的package.json所以我的主要应用程序包括在内:

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

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

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

当 Firebase CLI 部署您的代码时,它仅使用“函数”文件夹中的文件。 除此之外,它不会部署任何东西。 您的“src”文件夹在外面,因此不会部署。

您需要将“src/app/index.js”移动到 functions 文件夹内的某处并更改您的require以指向它。 或者您将需要以某种方式制作一个模块,当它未在本地运行时,您的 package.json 可以找到该模块。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM