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来转译:
- 安装依赖:
npm install @babel/core @babel/preset-env @babel/node --save-dev
- 在项目根目录创建
.babelrc文件:
{ "presets": ["@babel/preset-env"] }
- 用Babel运行你的代码:
npx babel-node your-script.js
内容的提问来源于stack exchange,提问作者mtths




