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:

Я попытался использовать 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 | })();
bozzmob
источник
2
Node.js теперь официально поддерживает функцию async. см. этот ответ .
Джотман Сингх
2
@JyotmanSingh Да. Я знаю, что теперь поддерживает. Этот вопрос задавали около года назад, когда нам пришлось использовать babel. Спасибо за упоминание.
bozzmob
4
Я только что разместил здесь, потому что многие люди все еще будут задавать этот вопрос. Они должны знать.
Джотман Сингх

Ответы:

166

Асинхронные функции не поддерживаются версиями Node старше 7.6 .

Вам нужно будет перенести ваш код (например, с помощью Babel ) в версию JS, которую Node понимает, если вы используете старую версию.

Тем не менее, текущая (2018 г.) LTS- версия Node.js - 8.x, поэтому, если вы используете более раннюю версию, вам следует очень серьезно подумать об обновлении.

Quentin
источник
36

Nodejs поддерживает async / await начиная с версии 7.6.

Сообщение о выпуске: https://v8project.blogspot.com.br/2016/10/v8-release-55.html

Филипп Морейра
источник
Вы можете развернуть свою функцию как NodeJS v6 или v8, убедитесь, что вы развертываете как v8 (бета).
Аарон Халворсен
28

Node.js не полностью поддерживает ES6 в настоящее время, так что вы можете использовать либо asyncawait модуль или 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!"));
}))();
Nivesh
источник
8
Очень важно использовать круглые скобки при использовании указанной выше библиотеки (asyncawait) для полифилла await и async. В ES2017 ключевые слова await и async. В приведенной выше библиотеке это функции.
Фил
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 может помочь, и вот простейшая конфигурация, которую я смог разработать:

stujo
источник
Щелкните еще раз, и я получил тот же результат. Я вижу ошибку 404 на гитхабе?
Оскар Неварес,
Мне нужно было использовать ./node_modules/.bin/babel-node helloz.js вместо babel-node helloz.js
Марти
Привет, Марти, я думаю, это зависит от того, установлен ли у вас babel-node глобально или только в рамках проекта пакета, в моем случае я, вероятно, установил его глобально
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
slideshowp2
источник
ТНХ, используя Бабель-плагин-преобразование Асинхр-к генератору решает мою проблему при использовании уродовать
Дэви
3

Хотя я опаздываю, у меня сработало то, что я установил плагин transform-async-generator и transform-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
Если вы используете код Visual Studio для angular, вам не нужно выполнять какую-либо работу после использования npm install сверху. Все будет установлено и настроено автоматически, но все равно спасибо!
цепная лестница
1

включите и укажите последнюю версию механизма узла, скажем, в это время я добавил версию 8.

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

в следующем файле

package.json

Джозеф Вамбура
источник
0

У меня тоже была такая же проблема.

Я запускал node v 6.2 вместе с purgecss в моем gulpfile. Проблема возникла только тогда, когда я создал новый проект Laravel; до этого момента у меня никогда не было проблем с purgecss.

Следуя заявлению @ Quentin - как версии узлов до 7.6 не поддерживают асинхронные функции - я решил обновить свою версию узла до 9.11.2.

Это сработало для меня:

1-

$ npm install -g n

$ n 9.11.2

2-

удалить node_modules из каталога маршрута

3-

$ npm install

Все еще не уверен, как node / purgecss работал до обновления ... но это помогло.

A.Morris
источник