web-dev-qa-db-ja.com

Firebase Async Awaitスタイルのクラウド関数

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);
};
32
Brandon

Cloud Functionsはnode.jsのLTSバージョンを実行します。これは documentation に従って、現時点では6.14.0です。ノード6.xはEcmaScript 6をサポートします。これは async/awaitを含まない です。

ただし、TypeScriptでコードを記述し、ES5/ES6にコードを変換して、async/awaitの使用をpromiseに効果的に変換できます。 Web検索では、おそらく このプラグイン を使用してBabelが同様の変換を行えるようにすることができます。

Firebase CLIで native TypeScript support を使用して新しいCloud Functionsプロジェクトを初期化できるようになりました。これは、Firebaseチームが現在開発者に推奨していることです。

TypeScriptを使用したくない場合は、ノード8(現在ベータ版であり、プレーンJavaScriptのasync/awaitをサポートしています)を展開ターゲットとして選択できるようになりました。 package.jsonを編集するにはドキュメントに従ってください を使用して、関数をノード8にデプロイする必要があることを示します。

41
Doug Stevenson

これで、Node.jsバージョン8functions/package.jsonに追加して使用できます:

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

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

33
l2aelba

TypeScriptをトランスパイルする代わりに、この 非常に素晴らしい投稿 を見て、 このリポジトリ

基本的に次のことができます:

npm install -g @babel/cli @babel/core @babel/preset-env
  • UPDATE:
    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"
      }
    }]
  ]
}

「関数」フォルダーを「firebaseFunctions」フォルダーに移動してから実行します

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

または、トランスパイルするファイルごとにこのコマンドを実行します

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

あなたのfunctions/.eslintrc.jsonファイルは'ecmaVersion': 2017これはeslint構文エラーを削除します

"parserOptions": {
    "ecmaVersion": 2017
 },

あなたのfunctions/package.jsonファイルセットnodeバージョン8以下を追加して

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

これにより、クラウドノードのバージョンが8に更新されます。デフォルトのノードバージョンは6です。

0
NuOne

上記のソリューションは私だけではうまくいきませんでした。最新のFirebaseツールに更新する必要がありました:

npm update -g firebase-tools

次に、次を追加してpackage.jsonを更新します:

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

そして、すべてがasync/awaitでうまく機能しました。

このブログのクレジット https://howtofirebase.com/cloud-functions-migrating-to-node-8-9640731a8acc

0
Adam