Node + Firestore执行基础查询触发JavaScript堆内存溢出问题求助
NodeJS + Firebase Admin 查询Firestore时触发JavaScript堆内存溢出错误
我使用NodeJS搭配Firebase Firestore进行测试,基于express.js搭建基础后端,每次尝试查询数据库文档时都会触发错误:FATAL ERROR: Ineffective mark-compacts near heap limit Allocation failed - JavaScript heap out of memory
代码示例
const admin = require('firebase-admin'); const credentials = require('./firebase_private.json'); admin.initializeApp({ credential: admin.credential.cert(credentials) }); const db = admin.firestore(); const subRef = db.collection("subscribers"); console.log('Checking if token exists'); const existingToken = await subRef.doc('123').get(); // <-- 触发错误的代码行
本地环境配置
- Node版本18
- firebase-admin版本11.5.0
- Firestore数据库仅含一个测试用小型文档
已尝试的解决方法
- 删除node_modules文件夹后重新执行
npm i - 切换Node 12与18版本
- 通过
--max_old_space_size=4096调整堆内存大小 - 在Firebase控制台在线查询数据(正常返回结果)
可行解决方案
确保Firebase Admin全局只初始化一次
如果初始化代码被重复执行(比如在express路由中重复引入),会导致多个Admin实例创建,持续占用内存。将初始化逻辑抽为单独模块,添加实例判断:// firebase.js const admin = require('firebase-admin'); const credentials = require('./firebase_private.json'); // 避免重复初始化 if (!admin.apps.length) { admin.initializeApp({ credential: admin.credential.cert(credentials) }); } const db = admin.firestore(); module.exports = db;后续业务代码直接引入该模块:
const db = require('./firebase.js'); async function checkToken() { const subRef = db.collection("subscribers"); console.log('Checking if token exists'); const existingToken = await subRef.doc('123').get(); }升级firebase-admin到最新稳定版
旧版本可能存在已知的内存泄漏问题,执行升级命令:npm install firebase-admin@latest规范async/await的使用场景
确保await语句处于async函数或Node.js模块顶层(Node 14+支持)中,避免语法异常引发的内存异常:// 包裹在async函数内执行 async function runQuery() { try { const subRef = db.collection("subscribers"); console.log('Checking if token exists'); const existingToken = await subRef.doc('123').get(); console.log('查询结果:', existingToken.exists); } catch (err) { console.error('查询失败:', err); } } runQuery();限制Firestore缓存大小(可选)
若启用本地持久化,可配置缓存上限避免内存过度占用:const db = admin.firestore({ settings: { // 设置缓存为50MB,或使用admin.firestore.CACHE_SIZE_UNLIMITED保持默认 cacheSizeBytes: 50 * 1024 * 1024 } });
内容的提问来源于stack exchange,提问作者CodeMonster
相关产品推荐
相关产品推荐

