Firebase Cloud Functions部署报Unexpected token '?'语法错误
问题根因
核心报错是云端Node.js运行时版本与依赖包版本不兼容:
- 你项目
package.json的engines字段声明Cloud Functions使用Node.js 12作为运行环境,Firebase部署时会严格按照这个配置拉起对应版本的Node实例运行代码。 - 你安装的
firebase-admin@11.x版本最低要求Node.js 14及以上运行环境,SDK代码中使用了ES2020标准的空值合并运算符??,Node.js 12的CommonJS模块加载器不识别该语法,在加载依赖阶段直接抛出SyntaxError: Unexpected token '?',导致函数启动失败。
你本地升级到Node 16/18仅影响本地开发调试环境,不会改变云端函数的运行时版本,这也是本地调试无异常、部署后云端报错的直接原因。
另外你的函数代码还有一个隐性逻辑问题:onCall方法没有接收异步操作返回的Promise,会导致删除用户操作还未执行完成,函数实例就可能被运行时回收,出现操作偶发失败的问题。
解决方案
方案1(推荐):升级云端运行时到Node 16
Node 12运行时已经被Firebase官方停止支持,直接升级到长期支持的Node 16版本是最稳妥的方案,操作步骤:
- 修改
package.json中的engines配置:"engines": { "node": "16" } - 在functions目录下执行命令,升级firebase-functions到适配Node 16的稳定版本:
npm install firebase-functions@latest - 修正函数入口代码,补全Promise返回和错误抛出逻辑,避免运行时异常:
const functions = require('firebase-functions'); const admin = require('firebase-admin'); admin.initializeApp(); exports.deleteUser = functions.https.onCall((data, context) => { const userID = data.userID; // 返回Promise让运行时等待异步操作执行完成 return admin.auth().deleteUser(userID) .then(() => { console.log('Successfully deleted userID: ', userID); return true }) .catch((error) => { console.log('Error deleting user: ', error); // 抛出标准化错误给调用端,不吞掉异常 throw new functions.https.HttpsError('internal', 'Failed to delete user', error); }); }); - 重新执行部署命令即可:
firebase deploy --only functions:deleteUser
方案2:降级firebase-admin适配Node 12
如果暂时无法升级Node运行时,可以将firebase-admin降级到兼容Node 12的v10大版本,操作步骤:
- 在functions目录下执行命令安装固定版本的依赖:
npm install firebase-admin@10.3.0 --save-exact - 建议删除
node_modules目录和package-lock.json文件后重新执行npm install,确保依赖版本正确无冲突。 - 按方案1中的步骤修正函数代码的Promise返回问题后,重新部署即可。
注意:该方案仅做临时兼容使用,Node 12运行时不再接收安全更新和功能支持,长期运行存在稳定性和安全风险,建议尽快升级到更高版本的Node运行时。
内容的提问来源于stack exchange,提问作者Lance Samaria
相关产品推荐
相关产品推荐

