适用于Firebase异步的云功能等待样式

Bra*_*don 34 firebase google-cloud-functions

看起来Cloud Functions不支持Async-Await表示法.有没有办法我可以使用Babel直到他们做或建议使用promises?

我在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);
};
Run Code Online (Sandbox Code Playgroud)

Dou*_*son 42

Cloud Functions运行node.js的LTS版本,此时根据文档 6.14.0.node 6.x支持EcmaScript 6,它不包含async/await.

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

值得注意的是,Firebase CLI现在允许您使用本机TypeScript支持初始化新的Cloud Functions项目,这是Firebase团队目前向开发人员推荐的内容.

如果您不想使用TypeScript,您现在也可以选择节点8(目前处于测试阶段,并且支持纯JavaScript的async/await)作为部署目标.您可以按照文档编辑package.json,以指示您的函数应该部署到节点8.

  • 加1用于设置"引擎":{"node":8}.这么快就解决了!希望我能+100. (3认同)

l2a*_*lba 33

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

"engines": {
   "node": "8"
}
Run Code Online (Sandbox Code Playgroud)

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

  • 如果要部署gcloud,则必须将--runtime nodejs8添加到gcloud,如果使用firebase工具部署函数,则不必添加此项 (2认同)

rma*_*rma 6

我没有转换TypeScript,而是按照这个非常好的帖子转换了我的javascript 并看看这个存储库

基本上你可以这样做:

npm install -g @babel/cli @babel/core @babel/preset-env
Run Code Online (Sandbox Code Playgroud)
  • 更新:
    我遇到了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"
      }
    }]
  ]
}
Run Code Online (Sandbox Code Playgroud)

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

babel firebaseFunctions --out-dir functions --copy-files --ignore firebaseFunctions/node_modules
Run Code Online (Sandbox Code Playgroud)

或者为要转换的每个文件运行此命令

babel originalfile.js --out-file transpiledfile.js
Run Code Online (Sandbox Code Playgroud)