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);
};
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にデプロイする必要があることを示します。
これで、Node.jsバージョン8をfunctions/package.json
に追加して使用できます:
"engines": {
"node": "8"
}
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
あなたのfunctions/.eslintrc.json
ファイルは'ecmaVersion': 2017
これはeslint構文エラーを削除します
"parserOptions": {
"ecmaVersion": 2017
},
あなたのfunctions/package.json
ファイルセットnode
バージョン8
以下を追加して
"engines": {
"node": "8"
},
これにより、クラウドノードのバージョンが8に更新されます。デフォルトのノードバージョンは6です。
上記のソリューションは私だけではうまくいきませんでした。最新のFirebaseツールに更新する必要がありました:
npm update -g firebase-tools
次に、次を追加してpackage.jsonを更新します:
"engines": {"node": "8"}
そして、すべてがasync/awaitでうまく機能しました。
このブログのクレジット https://howtofirebase.com/cloud-functions-migrating-to-node-8-9640731a8acc