SyntaxError:意外的令牌功能-异步等待Node.js


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:

我尝试按照Quentin的建议使用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 | })();

2
现在,Node.js正式支持异步功能。看到这个答案
Jyotman Singh

2
@JyotmanSingh是的。我知道它现在支持。当我们不得不使用babel时,这个问题问了将近一年。感谢您的提及。
bozzmob

4
我刚刚在这里发布了,因为仍有很多人会问这个问题。他们应该知道。
Jyotman Singh

Answers:


166

7.6版之前的Node版本不支持异步功能。

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

就是说,当前(2018年)的Node.js 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)来填充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可以提供帮助,这是我可以解决的最简单的配置:


再次Clic,我得到了相同的结果。我在github上看到404了吗?
奥斯卡·内瓦雷斯

我需要使用./node_modules/.bin/babel-node helloz.js而不是babel-node helloz.js
Marty,

嗨,Marty,我认为这取决于您是否在全球范围内或仅在软件包项目中安装了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

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
如果您使用Visual Studio代码进行角度设置,则从上方使用npm install之后,您无需执行任何工作。一切都会自动安装和配置,但是仍然感谢您!
chainsair

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

仍不确定在更新之前节点/清除的工作方式..但这确实成功了。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.