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。但是,async
和 await
关键字不能在旧版本中使用。
仍然出现此错误: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 中是啥意思?