节点GeoFire内存泄漏?

我似乎有一些非常基本的firebase + firebase-queue +在Node上运行的GeoFire代码,这看起来会导致内存泄漏,但是我并不相信我并没有把某些东西搞砸。

'use strict'; if (!process.env.FIREBASE_PROJECT_ID) { require('dotenv').config({ silent: true }); } let fbConfig = require('./firebase-config'); let fbNodes = fbConfig.NODES; let Queue = require('firebase-queue'); let admin = require("firebase-admin"); let GeoFire = require('geofire'); admin.initializeApp({ credential: admin.credential.cert(fbConfig.FIREBASE_SERVICE_ACCOUNT), databaseURL: fbConfig.APP_SETTINGS.databaseURL }); let db = admin.database(); let queueRef = db.ref(fbNodes.QUEUE); let geoFire = new GeoFire(db.ref(fbNodes.GEOFIRE)); var q = new Queue(queueRef, function (data, progress, resolve, reject) { let geoQuery = geoFire.query({ center: data.queryCenter, radius: data.maxDistanceKm }); // fires for every key returned by the geoQuery let listener = geoQuery.on('key_entered', function (key, loc, dist) { // do nothing }); // This will fire once the initial data is loaded, so now we can cancel // the "key_entered" event listener geoQuery.on('ready', function () { listener.cancel(); resolve(); }); }); 

下面是内存使用情况的内存消耗图表,显示了这个代码在大约10分钟后吞噬了1.5 GB的内存,并且解决了1100个任务,直到它崩溃。

内存使用情况制定的内存消耗

任何关于这里发生的事情的想法?

这是在运行:

  • 节点6.7.0
  • firebase-admin 4.0.4
  • firebase-queue 1.6.1
  • geofire 4.1.1

泄漏是由GeoFire查询造成的。 每次处理队列中的任务时,都会创build一个查询,但是这些查询永远不会被取消 – 只有他们的侦听器才会被取消。

要堵塞泄漏,请在完成后调用cancel 。 例如:

 geoQuery.on('ready', function () { listener.cancel(); geoQuery.cancel(); resolve(); });