You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Node.js v9中定义async函数遇'unexpected token function'错误求助

解决Node.js v9中async/await报'unexpected token function'的问题

嘿,这个问题我之前帮人排查过不少,咱一步步来解决:

1. 先检查你的async函数写法是否规范

async关键字必须直接跟在函数声明/定义的前面,不能乱加位置,给你举两个正确的例子:

// 普通函数声明
async function queryDatabase(sql) {
  const data = await yourDbDriver.query(sql);
  return data;
}

// 箭头函数写法
const queryDatabase = async (sql) => {
  const data = await yourDbDriver.query(sql);
  return data;
};

特别要注意:await只能在async函数内部使用,如果你在普通回调或者模块顶级作用域直接写await,也会触发语法错误(甚至连带影响async的识别)。比如这种错误写法:

// 错误!await不在async函数里
db.connect(() => {
  const result = await db.query('SELECT * FROM users');
});

改成这样就对了:

async function initDb() {
  await db.connect(); // 先确保连接完成
  const result = await db.query('SELECT * FROM users');
}
// 调用async函数,别忘了处理可能的错误
initDb().catch(err => console.error(err));

2. 确认你实际运行的Node.js版本真的是v9

有时候我们以为用的是v9,但可能因为nvm、多版本安装或者环境变量问题,实际运行的是更低版本(比如v7及以下,这些版本原生不支持async/await)。
打开终端跑一下:

node -v

如果输出不是v9.x.x,那得切换到正确的版本(比如用nvm的话,执行nvm use 9)。

3. 检查是否在特殊上下文里误用了async

比如在对象字面量里写async方法,v9是支持的,但写法要对:

// 正确
const dbUtils = {
  async getUsers() {
    return await db.query('SELECT * FROM users');
  }
};

如果写成async: function getUsers() {}这种错误格式,也会触发语法错误。

4. 实在不行,用Babel转译兜底

如果以上都排查过还是有问题,可能是你的代码里混了其他Node.js v9不支持的ES语法,或者环境有奇怪的限制。这时候可以用Babel来转译:

  1. 安装依赖:
npm install @babel/core @babel/preset-env @babel/node --save-dev
  1. 在项目根目录创建.babelrc文件:
{
  "presets": ["@babel/preset-env"]
}
  1. 用Babel运行你的代码:
npx babel-node your-script.js

内容的提问来源于stack exchange,提问作者mtths

火山引擎 最新活动