web-dev-qa-db-ja.com

SyntaxError:予定しないトーク機能 - 非同期ノード待機

私は自分のコードでNode version 6.2.1 を使うことを実験していました。ハイパーコールバック指向のコードの大部分を、見た目がきれいでパフォーマンスが良いものに移行する予定です。

ノードコードを実行しようとすると、端末がエラーを発生させる理由はわかりません。

helloz.js

(async function testingAsyncAwait() {
    await console.log("Print me!");
})();

ログ -

BOZZMOB-M-T0HZ:rest bozzmob$ node helloz.js 
/Users/bozzmob/Documents/work/nextgennms/rest/helloz.js:1
(function (exports, require, module, __filename, __dirname) { (async function testingAsyncAwait() {
                                                                     ^^^^^^^^
SyntaxError: Unexpected token function
    at Object.exports.runInThisContext (vm.js:53:16)
    at Module._compile (module.js:513:28)
    at Object.Module._extensions..js (module.js:550:10)
    at Module.load (module.js:458:32)
    at tryModuleLoad (module.js:417:12)
    at Function.Module._load (module.js:409:3)
    at Function.Module.runMain (module.js:575:10)
    at startup (node.js:160:18)
    at node.js:456:3
BOZZMOB-M-T0HZ:rest bozzmob$ node -v
v6.2.1

何が足りないの?私にも同じように光を投げてください。


アップデート1:

Quentinが示唆したようにBabelを使用しようとしました、しかし、私はまだ以下のエラーを得ています。

更新されたコード -

require("babel-core/register");
require("babel-polyfill");

    (async function testingAsyncAwait() {
        await console.log("Print me!");
    })();

ログ -

BOZZMOB-M-T0HZ:rest bozzmob$ babel helloz.js > helloz.trans.js
SyntaxError: helloz.js: Unexpected token (3:7)
  1 | require("babel-polyfill");
  2 | 
> 3 | (async function testingAsyncAwait() {
    |        ^
  4 |     await console.log("Print me!");
  5 | })();
105
bozzmob

非同期関数は バージョン7.6より前のNodeバージョンではサポートされていません

あなたはあなたのコードを(例えば Babel を使って)あなたが古いバージョンを使っているならNodeが理解できるバージョンのJSに変換する必要があるでしょう。

とはいえ、Node.jsの現在の(2018) _ lts _ バージョンは8.xなので、以前のバージョンを使用している場合は、アップグレードを強く検討する必要があります。

141
Quentin

Nodejsはバージョン7.6からのasync/awaitをサポートします。

リリースポスト: https://v8project.blogspot.com.br/2016/10/v8-release-55.html

34

Node.JSは現在ES6を完全にはサポートしていませんので、 asyncawait moduleまたは transpile をBableを使って使うことができます。

インストール

npm install --save asyncawait

helloz.js

var async = require('asyncawait/async');
var await = require('asyncawait/await');

(async (function testingAsyncAwait() {
    await (console.log("Print me!"));
}))();
27
Nivesh

実験しているだけであれば、babel-nodeコマンドラインツールを使用して新しいJavaScript機能を試すことができます。

  1. あなたのプロジェクトにbabel-cliをインストールしてください

    $ npm install --save-dev babel-cli

  2. プリセットをインストールする

    $ npm install --save-dev babel-preset-es2015 babel-preset-es2017

  3. バベルプリセットを設定する

    次の内容でプロジェクトのルートフォルダに.babelrcを作成します。

    { "presets": ["es2015","es2017"] }

  4. babel-nodeでスクリプトを実行してください。

    $ babel-node helloz.js

これは開発とテストのためだけのものですが、それはあなたがしていることのようです。結局、webpack(またはそれに似たもの)をセットアップして、すべてのコードを本番用に変換する必要があります。

あなたがどこか他の場所でコードを実行したいのであれば、webpackが助けになるでしょう、そしてこれが私が解決できる最も簡単な設定です:

20
stujo

node v6.6.0

あなたが開発に使うだけなら。あなたはこれを行うことができます:

npm i babel-cli babel-plugin-transform-async-to-generator babel-polyfill --save-dev

package.jsonは次のようになります。

"devDependencies": {
   "babel-cli": "^6.18.0",
   "babel-plugin-transform-async-to-generator": "^6.16.0",
   "babel-polyfill": "^6.20.0"
}

.babelrcファイルを作成してこれを書く:

{
  "plugins": ["transform-async-to-generator"]
}

そして、async/awaitスクリプトを次のように実行します。

./node_modules/.bin/babel-node script.js
12
slideshowp2

私は遅れて来ていますが、私のために働いたのは次のように transform-async-generatortransform-runtime pluginをインストールすることでした:

npm i babel-plugin-transform-async-to-generator babel-plugin-transform-runtime --save-dev

package.jsonは次のようになります。

"devDependencies": {
   "babel-plugin-transform-async-to-generator": "6.24.1",
   "babel-plugin-transform-runtime": "6.23.0"
}

.babelrcファイルを作成してこれを書く:

{
  "plugins": ["transform-async-to-generator", 
["transform-runtime", {
      "polyfill": false,
      "regenerator": true
    }]
]
}

そしてasync/awaitを使った幸せなコーディング

ノードエンジンのバージョンを最新のものに含めて指定します。現時点ではバージョン8を追加しました。

{
  "name": "functions",
  "dependencies": {
    "firebase-admin": "~7.3.0",
    "firebase-functions": "^2.2.1",
  },
  "engines": {
    "node": "8"
  },
  "private": true
}

次のファイルに

package.json

2