【问题标题】:SyntaxError: Unexpected token function - Async Await NodejsSyntaxError: Unexpected token function - Async Await Nodejs
【发布时间】:2016-10-15 09:48:57
【问题描述】:

我正在尝试在我的一些代码中使用 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 | })();

【问题讨论】:

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


【解决方案1】:

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

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

也就是说,不支持异步函数的versions of Node.js 现在都已过期且不受支持,因此如果您使用的是早期版本,您应该非常强烈地考虑升级。

【讨论】:

    【解决方案2】:

    Node.JS 目前不完全支持 ES6,所以你可以使用 asyncawait 模块或使用 Bable transpile 它。

    安装

    npm install --save asyncawait
    

    helloz.js

    var async = require('asyncawait/async');
    var await = require('asyncawait/await');
    
    (async (function testingAsyncAwait() {
        await (console.log("Print me!"));
    }))();
    

    【讨论】:

    • 在使用上述库 (asyncawait) 填充 await 和 async 时,使用括号至关重要。在 ES2017 中,await 和 async 是关键字。在上面的库中,它们是函数。
    【解决方案3】:

    如果您只是在尝试,可以使用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 可以提供帮助,这是我能想到的最简单的配置:

    【讨论】:

    • 再次点击,我得到了同样的结果。我在 github 上看到 404 ¿?
    • 我需要使用 ./node_modules/.bin/babel-node helloz.js 而不是 babel-node helloz.js
    • 嗨,Marty,我认为这取决于您是全局安装了 babel-node 还是仅在包项目中安装了 babel-node,在我的情况下,我可能已经全局安装了它
    【解决方案4】:

    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 时遇到的问题
    【解决方案5】:

    Nodejs 从 7.6 版本开始支持 async/await。

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

    【讨论】:

    • 您可以将您的功能部署为 NodeJS v6 或 v8,确保您部署为 v8(Beta)。
    【解决方案6】:

    虽然我来晚了,但对我有用的是像这样安装 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 编码

    【讨论】:

    • 如果您使用 Visual Studio 代码进行 Angular,则在使用上面的 npm install 后您不需要做任何工作。一切都会自动安装和配置,但还是谢谢你!
    【解决方案7】:

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

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

    在以下文件中

    package.json

    【讨论】:

      猜你喜欢
      • 2020-03-29
      • 2022-06-10
      • 2016-09-30
      • 1970-01-01
      • 1970-01-01
      • 2016-11-18
      • 1970-01-01
      相关资源
      最近更新 更多