【问题标题】:SyntaxError: missing ) after argument list, When using asyncSyntaxError: missing ) 在参数列表之后,使用异步时
【发布时间】:2018-02-28 15:01:33
【问题描述】:

为什么我在使用 async 时会收到此错误?

我的代码:

bot.onText(/\/start/, async  msg => {
  const opts = {
    parse_mode: 'Markdown' ,
    reply_markup: JSON.stringify({
      keyboard: StartKeyboard,
      resize_keyboard: true,
      one_time_keyboard: true
    })
  };
  await bot.sendMessage(msg.chat.id, 'Hi', opts);
});

错误:

bot.onText(/\/start/, async  msg => {
                      ^^^^^
SyntaxError: missing ) after argument list

我正在使用带有“依赖项”的 node.js v6.11.0:

{ "babel-polyfill": "^6.23.0",
  "cheerio": "^1.0.0-rc.2",
  "dotenv": "^4.0.0",
  "firebase": "^4.1.2",
  "firebase-admin": "^5.0.0",
  "node-telegram-bot-api": "^0.27.1",
  "request": "^2.81.0" },

【问题讨论】:

  • 异步/等待是 ES2017。 IIRC 节点直到 7.10 版才获得异步/等待。
  • babel-polyfill 不修复语法错误,只修复“API”相关的东西(Map、Set、Array...)。您需要调用babel 将您的代码转换为可运行的版本。我通常使用babel-node 这样做。
  • 如果您先通过 babel 运行代码以生成 ES6,然后再使用 Node.js 运行,这将起作用。
  • @Amy 我认为它的 async/await 默认情况下从 Node v7.6 启用。 Sedric 你能把你的节点版本升级到 > 8.x 吗?如果可以tj/n - 节点的版本管理器会让它变得超级简单。
  • @SedricHeidarizarei 不,这是最新的 LTS 版本。当前版本是 8.5。

标签: javascript node.js async-await telegram-bot


【解决方案1】:

您的 NodeJS (6.11 LTS) 版本太旧,不支持 async/await 功能。语法错误是由于 Javascript 解释器无法识别 async 标记并对参数感到困惑。

升级到 NodeJS 7.6 或更高版本。 https://www.infoq.com/news/2017/02/node-76-async-await

在以前的版本中,执行异步行为的唯一方法是使用promises

【讨论】:

  • 有没有办法在 node.js 6 中使用异步?因为我想用dory node应用在android服务器上运行
  • 还有其他方法可以进行异步工作,例如 Promise 或 Streams。但是,asyncawait 关键字不能在旧版本中使用。
  • 仍然出现此错误:Node.js v14.15.0。
  • @Kristian 你确定这是在异步/等待情况下发生的,还是你只是有语法错误?
  • @Kristian 我添加了一个答案,这可能有助于人们在较新版本的 Node 上看到此问题。
【解决方案2】:

如果您不想/不能更新您的节点版本,请尝试使用 babel 预设。 我在使用 ES6 和 jest(节点 v6.9.1)时遇到了同样的错误。

只需将这两个模块添加到您的依赖项中

npm install --save babel-preset-es2015 babel-preset-stage-0

并使用以下代码将文件 .babelrc 添加到您的根目录:

{ "presets": ["es2015", "stage-0"] }

如果您还没有使用它,请安装 babel-cli 并使用 babel-node 命令运行您的应用程序

sudo npm install -g babel-cli

babel-node app.js

【讨论】:

    【解决方案3】:

    如果您在使用较新版本的 Node 时看到此错误,则可能是语法或其他错误之前 Node 指出的行。

    例如,考虑下面的 sn-p。

    router.get("/", function (req, res, next) {
        try {
            res.json(await mySvc.myFunc());
        } catch (err) {
            console.error(err.message);
            next(err);
        }
    });
    

    node -v 报告 v14.17.6,这给出:

    myapp $ DEBUG=myapp:* npm start
    
    > myapp@0.0.0 start /home/me/myapp
    > node ./bin/www
    
    /home/me/myapp/routes/myroute.js:7
            res.json(await mySvc.myFunc());
                     ^^^^^
    
    SyntaxError: missing ) after argument list
    

    当然,错误出现在 sn-p 的第一行。在该行添加 async,因此,

    router.get("/", async function (req, res, next) {
    

    解决了这个问题。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-03-11
      • 2018-06-15
      • 1970-01-01
      • 2019-05-30
      • 2020-03-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多