Firebase Functions中使用async箭头函数时ESLint报错,请求协助
问题解决步骤
1. 统一Node版本(核心问题)
你的普通用户和sudo下Node版本不一致,这会导致依赖安装、ESLint解析和Firebase Functions运行环境不兼容。Firebase Functions目前支持Node 16、18(19属于非LTS版本,官方可能未适配),建议用nvm统一版本:
- 安装nvm(Node版本管理器):可通过官方提供的安装脚本或系统包管理器完成安装(比如Ubuntu用apt、macOS用brew)。
- 重启终端后,安装Firebase支持的Node版本(比如18):
nvm install 18 - 设置默认使用该版本:
nvm alias default 18 - 验证版本:
注意:避免用sudo运行Node相关命令,nvm管理的版本会全局生效,无需sudo。node -v
2. 修复ESLint配置错误
ESLint报错是因为它的解析器不识别async/await对应的语法,需要调整functions目录下的.eslintrc.js配置:
- 打开
.eslintrc.js,确保以下配置项正确:module.exports = { env: { node: true, // 启用Node.js环境语法支持 es2017: true // 开启ES2017语法支持(包含async/await) }, parserOptions: { ecmaVersion: 2017 // 或更高版本,比如2020 }, // 其他原有配置... }; - 保存后重新运行ESLint命令:
functions/node_modules/eslint/bin/eslint.js . --fix
3. 修正代码中的语法错误
你的代码存在方法调用错误,且混合了await与then/catch的写法,优化后代码如下:
exports.postcleanup = onSchedule("every day 00:00", async (event) => { const db = admin.database(); const dbRef = db.ref(); const posts = []; try { const snapshot = await dbRef.child("/allPosts").get(); if (snapshot.exists()) { // exists是方法,必须加()调用 const postData = snapshot.val(); // val是方法,必须加()调用 posts.push(postData); console.log("log on functions: " + posts.toString()); // toString是方法,加()调用 } else { console.log("No posts to delete"); } } catch (error) { console.log("error deleting old posts\n" + error); } console.log("teste"); });
- 关键修正点:
snapshot.exists、snapshot.val、posts.toString都是方法,必须添加()才能正确调用;用try/catch搭配await替代then/catch,让异步逻辑更清晰易读。
内容的提问来源于stack exchange,提问作者cassio
相关产品推荐
相关产品推荐

