gpt4 book ai didi

firebase - 运行连续的 firestore 查询时虚假的 MaxListenersExceededWarning EventEmitter 内存泄漏

转载 作者:行者123 更新时间:2023-12-04 12:41:56 33 4
gpt4 key购买 nike

我有一个 firebase HTTP 函数,它依次调用一些 firestore 操作。如果我多次调用 HTTP 函数,让每个调用在调用下一个之前完成,我会在 firebase 函数日志中收到以下错误:

(node:2) MaxListenersExceededWarning: Possible EventEmitter memory leak detected. 11 close listeners added. Use emitter.setMaxListeners() to increase limit

firebase 函数是一个导入任务,它获取要导入的数据,通过调用 firestore 查询检查重复项,如果没有,则通过另一个 DB 操作将数据添加到 firestore DB。

这是 firebase 函数,为简洁起见删除了部分:

module.exports = functions.https.onCall(async (obj, context) => {
// To isolate where the problem is
const wait = (ms: number) => new Promise(resolve => setTimeout(resolve, ms))
try {
const photo = getPhoto(obj)
// Query to look for duplicates
const query = db
.collection(`/Users/${context.auth.uid}/Photos`)
.where('date', '==', photo.date)
.where('order', '==', photo.order)
.limit(1)

await wait(300)
log.info('Before query')
const querySnap = await query.get()
log.info('After Query')
await wait(300)

// And then the rest of the code, removed for brevity
} catch (error) {
throw new functions.https.HttpsError('internal', error.message)
}
})

我在 const querySnap = await query.get() 前后插入了一个停顿,以表明确实是这个调用导致了错误消息。

我还将 firestore 记录器设置为输出其内部日志记录以帮助调试问题,方法是:

import * as admin from 'firebase-admin'
admin.initializeApp()
admin.firestore.setLogFunction(log => {
console.log(log)
})

所以我得到的更完整的日志输出是这样的:(从下到上阅读)

12:50:10.087 pm: After Query
12:50:10.087 pm: Firestore (2.3.0) 2019-09-13T19:50:10.087Z RTQ7I [Firestore._initializeStream]: Received stream end
12:50:10.084 pm: Firestore (2.3.0) 2019-09-13T19:50:10.084Z RTQ7I [Firestore._initializeStream]: Releasing stream
12:50:10.084 pm: Firestore (2.3.0) 2019-09-13T19:50:10.084Z RTQ7I [Firestore.readStream]: Received response: {"document":null,"transaction":{"type":"Buffer","data":[]},"readTime":{"seconds":"1568404210","nanos":76771000},"skippedResults":0}
12:50:10.026 pm: (node:2) MaxListenersExceededWarning: Possible EventEmitter memory leak detected. 11 close listeners added. Use emitter.setMaxListeners() to increase limit
12:50:10.020 pm: Firestore (2.3.0) 2019-09-13T19:50:10.020Z RTQ7I [Firestore.readStream]: Sending request: {"parent":"[redacted]/documents/Users/SpQ3wTsFzofj6wcsF7efRrSMrtV2","structuredQuery":{"from":[{"collectionId":"Photos"}],"where":{"compositeFilter":{"op":"AND","filters":[{"fieldFilter":{"field":{"fieldPath":"date"},"op":"EQUAL","value":{"stringValue":"2019-06-26"}}},{"fieldFilter":{"field":{"fieldPath":"order"},"op":"EQUAL","value":{"integerValue":0}}}]}},"limit":{"value":1}}}
12:50:10.019 pm: Firestore (2.3.0) 2019-09-13T19:50:10.019Z RTQ7I [ClientPool.acquire]: Re-using existing client with 100 remaining operations
12:50:10.012 pm: Before query

有趣的是,我通常以 10 个批处理运行这些导入。我似乎只在第一批 10 个中出现错误。如果我随后快速运行更多批处理,我似乎不会再次出现错误.但如果我等一段时间,它就会返回。另外,错误发生在批处理中的哪个调用是不一致的。它可能是第 9 次或第 2 次调用,或任何其他调用。

最后,错误不会停止执行。事实上,进口似乎永远不会失败。但是,我不喜欢在我的日志中出现下落不明的错误!和他们在一起我晚上睡不着觉。 :-)

我很感激你能提供的任何帮助。

最佳答案

我从 Firebase 支持团队那里得到了有用的回复。他们告诉我尝试安装最新版本的 firebase-admin(将其从 8.5.0 升级到 8.6.0)并解决了问题,即使没有安装 grpc 的解决方法。所以,我认为这应该是现在的正确答案。

关于firebase - 运行连续的 firestore 查询时虚假的 MaxListenersExceededWarning EventEmitter 内存泄漏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57929956/

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com