SyntaxError:意外的令牌功能 - 异步等待Nodejs

boz*_*mob 113 javascript asynchronous node.js express async-await

我正在尝试使用Node版本6.2.1和我的一些代码.计划将大多数面向超回调的代码迁移到看起来更干净且可能表现更好的代码.

我不知道为什么,当我尝试执行节点代码时终端抛出错误.

helloz.js

(async function testingAsyncAwait() {
    await console.log("Print me!");
})();
Run Code Online (Sandbox Code Playgroud)

日志 -

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
Run Code Online (Sandbox Code Playgroud)

我错过了什么?请给我一些启示.


更新1:

我尝试使用Babel作为Quentin建议,但是,我仍然收到以下错误.

更新的代码 -

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

    (async function testingAsyncAwait() {
        await console.log("Print me!");
    })();
Run Code Online (Sandbox Code Playgroud)

日志 -

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 | })();
Run Code Online (Sandbox Code Playgroud)

Que*_*tin 155

早于7.6版的Node版本不支持异步功能.

如果您使用的是旧版本,则需要将代码(例如使用Babel)转换为Node理解的JS版本.

也就是说,Node.js 的当前(2018)LTS版本是8.x,所以如果你使用的是早期版本,你应该非常强烈地考虑升级.


小智 35

Nodejs支持7.6版本的async/await.

发布帖子:https://v8project.blogspot.com.br/2016/10/v8-release-55.html


Niv*_*esh 27

Node.js的不完全支持ES6目前,这样你既可以使用asyncawait模块或transpile使用巴布尔它.

安装

npm install --save asyncawait
Run Code Online (Sandbox Code Playgroud)

helloz.js

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

(async (function testingAsyncAwait() {
    await (console.log("Print me!"));
}))();
Run Code Online (Sandbox Code Playgroud)

  • 在使用上面的库(asyncawait)进行polyfill await和async时,使用括号是至关重要的.在ES2017中,等待和异步是关键字.在上面的库中,它们是函数. (8认同)

stu*_*ujo 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可以提供帮助,这是我可以解决的最简单的配置:


sli*_*wp2 12

node v6.6.0

如果你只是用在开发中.你可以这样做:

npm i babel-cli babel-plugin-transform-async-to-generator babel-polyfill --save-dev
Run Code Online (Sandbox Code Playgroud)

package.json会是这样:

"devDependencies": {
   "babel-cli": "^6.18.0",
   "babel-plugin-transform-async-to-generator": "^6.16.0",
   "babel-polyfill": "^6.20.0"
}
Run Code Online (Sandbox Code Playgroud)

创建.babelrc文件并写下:

{
  "plugins": ["transform-async-to-generator"]
}
Run Code Online (Sandbox Code Playgroud)

然后,async/await像这样运行你的脚本:

./node_modules/.bin/babel-node script.js
Run Code Online (Sandbox Code Playgroud)