簡體   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