SyntaxError: Неожиданная функция токена - Async Await Nodejs
Я экспериментировал с использованием Node версии 6.2.1 с некоторым кодом. Если бы планировалось перенести большинство кодов с гипер-обратным вызовом на то, что выглядит более чистым и, возможно, работает лучше.
У меня нет подсказки, почему терминал вызывает ошибку, когда я пытаюсь выполнить код Node.
helloz.js
(async function testingAsyncAwait() {
await console.log("For Trump Sake 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("For Trump Sake 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("For Trump Sake Print me!");
5 | })();
Ответы
Ответ 1
Асинхронные функции не поддерживаются версиями узлов старше версии 7.6.
Вам нужно будет преобразовать ваш код (например, с помощью Babel) в версию JS, которую Node понимает, если вы используете более старую версию.
Тем не менее, текущая (2018) версия LTS Node.js - 8.x, поэтому, если вы используете более раннюю версию, вы должны очень сильно рассмотреть возможность обновления.
Ответ 2
Nodejs поддерживает async/await с версии 7.6.
Сообщение выпуска: https://v8project.blogspot.com.br/2016/10/v8-release-55.html
Ответ 3
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("For Trump Sake Print me!"));
}))();
Ответ 4
Если вы просто экспериментируете, вы можете использовать инструмент командной строки babel-node
, чтобы попробовать новые функции JavaScript
-
Установите babel-cli
в свой проект
$ npm install --save-dev babel-cli
-
Установите пресеты
$ npm install --save-dev babel-preset-es2015 babel-preset-es2017
-
Настройте ваши настройки буферизации
Создайте .babelrc
в корневой папке проекта со следующим содержимым:
{ "presets": ["es2015","es2017"] }
-
Запустите script с помощью babel-node
$ babel-node helloz.js
Это только для разработки и тестирования, но это похоже на то, что вы делаете. В конце вы захотите настроить webpack (или что-то подобное), чтобы передать весь ваш код для производства
Если вы хотите запустить код где-то еще, webpack может помочь, и вот самая простая конфигурация, которую я мог бы решить:
Ответ 5
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
Ответ 6
Хотя я прихожу поздно, для меня работала установка 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
Ответ 7
Узел быстро меняется, поэтому я подумал, что может быть полезно опубликовать и обновить:
В это время я запускаю узел VER 8.11.4, и следующий код работает нормально, не устанавливая asychawait:
function resolveAfter2Seconds() {
return new Promise(resolve => {
setTimeout(() => {
resolve('resolved');
}, 2000);
});
}
async function asyncCall() {
console.log('calling');
var result = await resolveAfter2Seconds();
console.log(result);
// expected output: 'resolved'
}
asyncCall();
Этот пример и более подробная информация размещена здесь: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/async_function