【问题标题】:Node 8 Firebase functions fails to deploy from CloudBuildNode 8 Firebase 函数无法从 CloudBuild 部署
【发布时间】:2019-03-26 16:01:18
【问题描述】:

我有一个项目使用 Node 8 引擎从我的本地开发环境成功部署到 firebase 功能到 firebase。我一直在尝试让它与 CloudBuild 一起使用,但是,由于使用了 async 关键字,我得到了一个语法错误:

/workspace/functions/lib/index.js:13
Step #5: app.get('XXXXXXXXX', async (req, resp) => {
Step #5: ^
Step #5: 
Step #5: SyntaxError: Unexpected token (
Step #5: at createScript (vm.js:56:10)
Step #5: at Object.runInThisContext (vm.js:97:10)
Step #5: at Module._compile (module.js:549:28)
Step #5: at Object.Module._extensions..js (module.js:586:10)
Step #5: at Module.load (module.js:494:32)
Step #5: at tryModuleLoad (module.js:453:12)
Step #5: at Function.Module._load (module.js:445:3)
Step #5: at Module.require (module.js:504:17)
Step #5: at require (internal/module.js:20:19)
Step #5: at /usr/local/lib/node_modules/firebase-tools/lib/triggerParser.js:21:11

表示节点引擎不支持 async/await,即不支持 Node 8。引擎在 package.json 中设置并在我的本地环境中工作。

"engines": {
    "node": "8"
  }

部署使用的是 documentation 中所述的 firebase 容器:

- name: 'gcr.io/[PROJECT_NAME]/firebase'
  args: [ 'deploy', '-P', 'prod', '-f', '--only', 'functions','--token', '${_FIREBASE_TOKEN}']

对于不支持 Node8 并因此静默降级的 Firebase 功能,CloudBuild 是否可以部署到不同的/内部端点?

或者还有什么我错过的?

我试图通过将 .tsconfig 更改为目标 es2015 而不是 es2017 来证明这一理论,并从 package.json 中删除了引擎部分。结果是函数部署到一个Node8函数上?

Step #5: deploying functions
Step #5: functions: ensuring necessary APIs are enabled...
Step #5: functions: all necessary APIs are enabled
Step #5: functions: preparing functions directory for uploading...
Step #5: functions: packaged functions (91.42 KB) for uploading
Step #5: functions: functions folder uploaded successfully
Step #5: functions: updating Node.js 8 function XXXXXX(us-central1)...
Step #5: functions[XXXXXXX(us-central1)]: Successful update operation.
Step #5:
Step #5: Deploy complete!

我认为这是因为 node 8 函数已经存在所以它只是一个更新而不是创建,但可能表明代码解析器是基于 node6 并且在通过 cloudbuild 部署时忽略了引擎设置?

【问题讨论】:

    标签: firebase google-cloud-functions google-cloud-build


    【解决方案1】:

    Firebase 工具将解析您的代码以查找函数触发器名称,而这似乎就是它出错的地方。

    我的猜测是您的自定义容器 gcr.io/[PROJECT_NAME]/firebase 运行的 Node 版本与 ES2017/ES8 async/await 关键字不兼容。

    您需要确保您的容器至少运行 Node v7.6.0。

    希望这会有所帮助。

    【讨论】:

    • 太棒了,谢谢@Robula。 CloudBuild 文档显示使用 node:boron 作为 firebase 的容器,但这是节点 6。我切换到 carbon 并且它正在工作。
    猜你喜欢
    • 1970-01-01
    • 2019-04-30
    • 1970-01-01
    • 2018-10-22
    • 2022-07-28
    • 2018-06-20
    • 2020-10-25
    • 2018-12-31
    • 1970-01-01
    相关资源
    最近更新 更多