Firebase 异步等待风格的云函数

Posted

技术标签:

【中文标题】Firebase 异步等待风格的云函数【英文标题】:Cloud Functions for Firebase Async Await style 【发布时间】:2017-11-10 16:10:00 【问题描述】:

看起来 Cloud Functions 不支持 Async-Await 表示法。有没有办法在他们使用 Babel 之前使用它们,或者是否建议使用 Promise?

我当前在 Node 上的函数是这样的:

exports.getToken = async (req, res) => 
  //1. Generate token from Braintree
  const result = await gateway.clientToken.generate();

  //2. Return the client token
  res.json(result.clientToken);
;

【问题讨论】:

【参考方案1】:

Cloud Functions 运行的是 LTS 版本的 node.js,根据documentation,此时该版本为 6.14.0。 node 6.x 支持 EcmaScript 6,does not include async/await。

但是,您可以使用 TypeScript 编写代码并将其转换为 ES5/ES6,这将有效地将 async/await 的使用转换为 Promise。网络搜索表明,也许this plugin 可以用来帮助 Babel 进行类似的转译。

值得注意的是,Firebase CLI 现在允许您使用 native TypeScript support 初始化一个新的 Cloud Functions 项目,这是 Firebase 团队目前向开发人员推荐的。

如果您不想使用 TypeScript,您现在还可以选择节点 8(目前处于测试阶段,并且支持纯 javascript 的 async/await)作为部署目标。您可以follow the documentation to edit your package.json 表示您的功能应该部署到节点8。

【讨论】:

使用 babel 将 ES8 代码编译为与 Cloud Functions 一起使用的 ES6 代码也很容易,请参见此处的示例:codeburst.io/es6-in-cloud-functions-for-firebase-2-415d15205468 谢谢,解决了我的问题,但是,如果所有子项都是旧值,则整个分支都将被删除>>我可以保持分支为空吗? 加 1 用于设置“engine”:“node”:8。这么快的修复!希望我能 +100。【参考方案2】:

在关注very nice post 并查看this repository 之后,我已经转译了我的 javascript,而不是转译 TypeScript

基本上你可以这样做:

npm install -g @babel/cli @babel/core @babel/preset-env

更新: 我在使用 babel 的“7.0.0-beta.51”版本时遇到问题。 “7.0.0-beta.44”还可以。 切换到稳定版本 6

npm install --save-dev babel-cli babel-preset-env

在你的项目文件夹中创建文件 .babelrc


  "presets": [
    ["@babel/env", 
      "targets": 
        "node": "6.11.5"
      
    ]
  ]

将“functions”文件夹移动到“firebaseFunctions”文件夹,然后运行

babel firebaseFunctions --out-dir functions --copy-files --ignore firebaseFunctions/node_modules

或者为每个你想要转换的文件运行这个命令

babel originalfile.js --out-file transpiledfile.js

【讨论】:

【参考方案3】:

现在您可以通过在functions/package.json 中添加以下内容来使用 Node.js 版本 8

"engines": 
   "node": "8"

示例:https://github.com/firebase/functions-samples/blob/Node-8/authenticated-json-api/functions/package.json

【讨论】:

很奇怪。我不必那样做 gcloud 部署需要添加--runtime nodejs8 到gcloud,使用firebase 工具部署函数不需要添加 这很好用,现在可能需要被接受为响应,因为函数在运行时也使用节点 8 更新运行节点到8也解决问题。 谢谢,节省了我一些时间。【参考方案4】:

在您的functions/.eslintrc.json 文件中设置为'ecmaVersion': 2017 这将消除 eslint 语法错误

"parserOptions": 
    "ecmaVersion": 2017
 ,

在您的functions/package.json 文件中,通过在下面添加将node 版本设置为8

"engines": 
     "node": "8"
,

这会将云节点版本更新为 8 默认节点版本为 6

【讨论】:

【参考方案5】:

上述解决方案不适用于我一个人。我必须更新到最新的 firebase 工具:

npm update -g firebase-tools

然后更新我的 package.json 添加:

 "engines": "node": "8"

使用 async/await 一切正常。

感谢此博客https://howtofirebase.com/cloud-functions-migrating-to-node-8-9640731a8acc

【讨论】:

【参考方案6】:

正如@adam 所说,解决了我重新安装/升级全局firebase包的问题

区别在于我的情况是使用 NVM (节点版本管理器)。 不知何故,我的默认节点(v13.x)有firebase-tools,但我没有在项目节点(v10/8)全局安装 所以首先:

nvm use 10

然后:

npm i -g firebase-tools

以正确的节点版本重新安装使我的异步功能正常工作。

【讨论】:

以上是关于Firebase 异步等待风格的云函数的主要内容,如果未能解决你的问题,请参考以下文章

Firebase 的云函数 - getaddrinfo ENOTFOUND

Firebase 的云函数:增量计数器

Firebase 的云函数:序列化 Promise

使用 Firebase CLI shell 测试可调用的云函数

防止滥用:Firebase 的云功能

使用 typescript 和 if 语句的云函数