SyntaxError:予期しないトークン関数-Async Await Nodejs


122

私は自分のコードのいくつかでNodeバージョン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:

クエンティンが示唆するように私はバベルを使用しようとしましたが、それでも次のエラーが発生します。

更新されたコード

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 | })();

2
Node.jsが非同期関数を正式にサポートするようになりました。この答えを見てください
Jyotman Singh 2017

2
@JyotmanSinghはい。私はそれが今サポートしていることを知っています。この質問は、1年近く前にバベルを使用する必要があったことを尋ねていました。言及してくれてありがとう。
bozzmob 2017

4
多くの人々がこの質問にまだ来るので、私はここに投稿しました。彼らは知っておくべきです。
Jyotman Singh 2017

回答:


166

非同期機能は、バージョン7.6より前のバージョンのノードではサポートされいません

古いバージョンを使用している場合、Nodeが理解できるJSのバージョンにコードを変換する必要があります(例:Babelを使用)。

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



28

Node.JSは現在ES6を完全にサポートしていないため、asyncawaitモジュールを使用するか、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!"));
}))();

8
上記のライブラリ(asyncawait)を使用して待機と非同期をポリフィルする場合は、括弧を使用することが重要です。ES2017では、awaitとasyncがキーワードです。上記のライブラリでは、これらは関数です。
Phil

19

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

  1. babel-cliプロジェクトにインストールする

    $ npm install --save-dev babel-cli

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

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

  3. Babelプリセットをセットアップする

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

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

  4. でスクリプトを実行する babel-node

    $ babel-node helloz.js

これは開発とテストのためだけのものですが、それはあなたがやっていることのようです。最後に、すべてのコードを本番用にトランスパイルするようにWebpack(または類似の何か)をセットアップする

別の場所でコードを実行したい場合は、webpackが役立ちます。これが、私が解決できる最も簡単な構成です。


もう一度クリックすると、同じ結果が得られました。GitHubに404が表示されますか?
Oscar Nevarez 2017

babel-node helloz.jsの代わりに./node_modules/.bin/babel-node helloz.jsを使用する必要がありました
Marty

こんにちはマーティ、私はそれはあなたがバベル・ノードグローバルにインストールされているか、単にパッケージプロジェクト内で、私の場合、私はおそらくそれがグローバルにインストールした場合に依存だと思う
stujo

12

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

thx、babel-plugin-transform-async-to-generatorを使用すると、uglifyを使用するときの問題が解決します
davey

3

私は遅くに来ていますが、私にとってうまくいったのは、transform-async-generatortransform-runtimeプラグインを次のようにインストールすることでした。

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


1
Angularのビジュアルスタジオコードを使用している場合は、上記のnpm installを使用した後で作業を行う必要はありません。すべてが自動的にインストールおよび構成されますが、とにかくありがとうございます!
chainstair

1

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

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

次のファイル

package.json


0

私も同じ問題を抱えていました。

私はgulpfile内でpurgecssを使用すると同時にノードv 6.2を実行していました。新しいLaravelプロジェクトを作成したときにのみ問題が発生しました。その時点まで、私はパージの問題はありませんでした。

@Quentinのステートメントに従って-7.6より前のノードバージョンが非同期機能をサポートしない方法-ノードバージョンを9.11.2に更新することにしました

これは私のために働きました:

1-

$ npm install -g n

$ n 9.11.2

2-

ルートディレクトリから「node_modules」を削除します

3-

$ npm install

更新前のnode / purgecssの動作はまだわかりませんが、これでうまくいきました。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.