SyntaxError: missing ) 在参数列表之后,使用异步时

Posted

技术标签:

【中文标题】SyntaxError: missing ) 在参数列表之后,使用异步时【英文标题】:SyntaxError: missing ) after argument list, When using async 【发布时间】: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。 【参考方案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) 

解决了这个问题。

【讨论】:

以上是关于SyntaxError: missing ) 在参数列表之后,使用异步时的主要内容,如果未能解决你的问题,请参考以下文章

JavaScript:SyntaxError:missing)参数列表后[关闭]

SyntaxError: missing ; before statement 错误的解决

git-bash: SyntaxError: missing ) 在参数列表之后

SyntaxError: missing ] after element list 火狐问题

无法理解 Firefox 错误:SyntaxError: missing after property list

“SyntaxError: Missing parentheses in call to 'print'”在 Python 中是啥意思?