[英]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
中有express
和cors
依賴項。
Doug Stevenson的回答很好地解釋了我的問題。 我不知道這個“限制”(或功能?)。
我最終嘗試了兩種不同的方法:
在我的functions/
目錄中,我創建了一個指向我的應用程序的符號鏈接: ln -s../src./src
,然后像這樣更改了functions/index.js
中的路徑const app = require('../src/app') → const app = require('./src/app')
。
我能夠通過仿真器套件對此進行測試,並且 function 也已成功部署,並且我能夠調用已部署的函數。
這種方法沒有用。 我修改了/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.