SyntaxError: Несподівана функція лексеми - Async Await Nodejs


122

Я експериментував із використанням вузла версії 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 тепер офіційно підтримує функцію async. дивіться цю відповідь .
Jyotman Singh

2
@JyotmanSingh Так. Я знаю, це зараз підтримує. Це питання задавали майже рік тому, коли нам довелося використовувати вавило. Дякую за згадку, хоча.
bozzmob

4
Я щойно опублікував тут, тому що багато людей все одно прийдуть до цього питання. Вони повинні знати.
Jyotman Singh

Відповіді:


166

Функції асинхронізації не підтримуються версіями Node, старшими за версію 7.6 .

Вам потрібно буде скопіювати свій код (наприклад, за допомогою Babel ) у версію JS, яку Node розуміє, якщо ви використовуєте старішу версію.

З цього приводу, поточна (2018) версія LTS Node.js становить 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 очікування та асинхронізація - це ключові слова. У бібліотеці, наведеній вище, вони є функціями.
Філ

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. Налаштуйте свої пресети

    Створіть .babelrcу кореневій папці проекту такий вміст:

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

  4. Запустіть свій сценарій за допомогою babel-node

    $ babel-node helloz.js

Це лише для розробки та тестування, але це, здається, саме ви робите. Зрештою, ви захочете налаштувати вебпакет (або щось подібне), щоб передати весь код для виробництва

Якщо ви хочете запустити код де-небудь ще, webpack може допомогти, і ось найпростіша конфігурація, яку я міг би розробити:


Ще раз натисніть, і я отримав такий же результат. Я бачу 404 на github ¿?
Оскар Неварес

Мені потрібно було скористатися ./node_modules/.bin/babel-node helloz.js замість babel-вузла helloz.js
Марті

Привіт, Марти, я думаю, що це залежить від того, чи встановлений у вас вузол babel у всьому світі або просто в рамках пакетного проекту, в моєму випадку я, мабуть, встановив його глобально
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

3

Хоча я заходжу пізно, те, що для мене спрацювало, було встановити плагін -трансформатор-асинхрон та трансформатор-час виконання так:

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
якщо ур, використовуючи візуальний код студії для кутових, вам не потрібно робити будь-яку роботу після використання npm встановити зверху. Все буде встановлено та налаштовано автоматично, але все одно дякую!
ланцюжок

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; До цього моменту у мене ніколи не було проблеми з чисткою.

Після заяви @ Quentin - як версії вузлів до 7.6 не підтримують функції асинхронізації - я вирішив оновити свою версію вузла до 9.11.2

Це працювало для мене:

1-

$ npm install -g n

$ n 9.11.2

2-

видалити 'node_modules' з каталогу маршрутів

3-

$ npm install

Ще не впевнений, як працював вузол / purgecss до оновлення .. але це зробило трюк.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.