Firebase Functions执行deploy部署时出现eslint解析错误如何解决
Firebase Functions 部署报错解决方案
错误根因
- 初始化Functions时选择了TypeScript作为开发语言,项目默认配置了仅适配TS的ESLint校验规则,你额外添加的JS文件没有被纳入TS配置的检测范围,触发parser报错
- 代码存在作用域、依赖引入、异步返回等逻辑错误
- 同时存在
index.js和index.ts两个入口文件,导致配置冲突
分步修复步骤
步骤1:统一开发语言,删除多余入口文件
查看functions目录下是否存在tsconfig.json文件:
- 如果存在,说明当初选择的是TS开发,删除所有多余的
index.js文件(包括functions根目录和src目录下的js入口),仅保留functions/src/index.ts - 如果不存在,说明是JS开发,删除所有
index.ts文件,仅保留js入口
步骤2:修复ESLint配置(可选,仅需要混写JS/TS时操作)
如果确实需要同时使用JS和TS,修改functions目录下的.eslintrc.js配置:
在parserOptions节点下添加extraFileExtensions: ['.js'],同时修改tsconfig.json的include数组,新增"**/*.js"规则即可。
步骤3:修复代码逻辑错误
你提供的测试代码存在以下问题:
admin.initializeApp()初始化顺序错误,必须在实例化firestore之前执行field变量在if/else块内用const声明,属于块级作用域,外部无法访问- 未引入
firebase模块就直接调用firebase.firestore.FieldValue,可直接用已引入的admin模块替代 - 数据库写入操作是异步Promise,没有return会导致云函数提前终止,执行失败
- 变量名重复,你用了
vote作为路径参数名又声明了同名变量,容易触发逻辑错误 - 写入数据库时
field是变量,需要用计算属性包裹,否则会被识别为固定字符串"field"
步骤4:临时跳过Lint校验(不推荐长期使用)
如果暂时不想处理ESLint规则,可以修改根目录的firebase.json,删除functions节点下的predeploy配置项,即可跳过校验直接部署。
修复后的代码示例(JS版本)
const functions = require("firebase-functions"); const admin = require('firebase-admin'); admin.initializeApp(); const db = admin.firestore(); exports.vote = functions.firestore .document('Votes/{vote}') .onCreate((document, context) => { const row = document.data()['id']; const voteVal = document.data()['vote']; // 把field提到块外声明 let field; if (voteVal == 1) { field = '1star'; } else if (voteVal == 2) { field = '2star'; } else if (voteVal == 3) { field = '3star'; } else if (voteVal == 4) { field = '4star'; } else { field = '5star'; } // 用admin替代未引入的firebase const incremento = admin.firestore.FieldValue.increment(1); const incrementv = admin.firestore.FieldValue.increment(1); // 返回异步Promise,使用计算属性识别field变量 return db.doc('message/'+row).set({[field]: incremento, 'votes': incrementv}) });
内容的提问来源于stack exchange,提问作者chrispsv
相关产品推荐
相关产品推荐

