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

时间:2016-06-14 15:07:14

标签: javascript node.js express asynchronous async-await

我正在尝试使用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作为Quentin建议,但是,我仍然收到以下错误。

更新代码 -

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 | })();

9 个答案:

答案 0 :(得分:143)

异步函数是not supported by Node versions older than version 7.6

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

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

答案 1 :(得分:34)

Nodejs支持版本7.6的async / await。

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

答案 2 :(得分:27)

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!"));
}))();

答案 3 :(得分:20)

如果您只是在试验,可以使用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

  5. 这仅适用于开发和测试,但这似乎就是您正在做的事情。最后,您需要设置webpack(或类似的东西)来转换所有生产代码

    如果你想在其他地方运行代码,webpack可以提供帮助,这是我可以解决的最简单的配置:

答案 4 :(得分: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

答案 5 :(得分: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

进行快乐编码

答案 6 :(得分:2)

包括并指定节点引擎版本为最新版本,例如,此时我确实添加了版本8。

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

在以下文件中

  

package.json

答案 7 :(得分:0)

我也有同样的问题。

我正在使用gulpfile中的purgecss运行节点v 6.2。仅当我创建了一个新的Laravel项目时才出现问题;到那时为止,我从来没有遇到过吹扫问题。

按照@Quentin的声明-7.6之前的节点版本不支持异步功能-我决定将节点版本更新为9.11.2

这对我有用:

1-

pg_lsclusters

2-

从路由目录中删除“ node_modules”

3-

$ npm install -g n

$ n 9.11.2

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

答案 8 :(得分:-1)

节点变化迅速,所以我认为发布和更新可能会有所帮助:

这一次,我正在运行节点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