RangeError:在node_modules – > elasticsearch中超出最大调用堆栈大小

在尝试编写一个在Firebase函数上部署的函数时,我写了下面的代码:

'use strict'; const elasticsearch = require('elasticsearch'); const firebaseAdmin = require('firebase-admin'); const functions = require('firebase-functions'); const Promise = require('promise'); const config = { firebaseUrl: FIREBASE_URL, elasticSearchUrl: ELASTICSEARCH_URL }; // configure firebase const serviceAccount = require("./serviceAccountKey.json"); firebaseAdmin.initializeApp({ credential: firebaseAdmin.credential.cert(serviceAccount), databaseURL: config.firebaseUrl }); const database = firebaseAdmin.database(); const client = new elasticsearch.Client({ host: config.elasticSearchUrl }); exports.indexentry = functions.database.ref('/posts/{postid}/text').onWrite(event => { let data = event.data.val(); let post_id = event.params.postid; let indexData = { index: "firebase", type: "posts", id: post_id, body: data } return client.index(indexData).then(response => { console.log('Response: '); }); }); 

我收到一个错误:

错误:分析函数触发器时发生错误。

 RangeError: Maximum call stack size exceeded at Function.EventEmitter.listenerCount (events.js:440:38) at Log.listenerCount (C:\Users\Dell\AppData\Local\Temp\fbfn_10872H41uMk66c53o\node_modules\elasticsearch\src\lib\log.js:68:25) at Function.EventEmitter.listenerCount (events.js:442:20) at Log.listenerCount (C:\Users\Dell\AppData\Local\Temp\fbfn_10872H41uMk66c53o\node_modules\elasticsearch\src\lib\log.js:68:25) at Function.EventEmitter.listenerCount (events.js:442:20) at Log.listenerCount (C:\Users\Dell\AppData\Local\Temp\fbfn_10872H41uMk66c53o\node_modules\elasticsearch\src\lib\log.js:68:25) at Function.EventEmitter.listenerCount (events.js:442:20) at Log.listenerCount (C:\Users\Dell\AppData\Local\Temp\fbfn_10872H41uMk66c53o\node_modules\elasticsearch\src\lib\log.js:68:25) at Function.EventEmitter.listenerCount (events.js:442:20) at Log.listenerCount (C:\Users\Dell\AppData\Local\Temp\fbfn_10872H41uMk66c53o\node_modules\elasticsearch\src\lib\log.js:68:25) at Function.EventEmitter.listenerCount (events.js:442:20) at Log.listenerCount (C:\Users\Dell\AppData\Local\Temp\fbfn_10872H41uMk66c53o\node_modules\elasticsearch\src\lib\log.js:68:25) at Function.EventEmitter.listenerCount (events.js:442:20) at Log.listenerCount (C:\Users\Dell\AppData\Local\Temp\fbfn_10872H41uMk66c53o\node_modules\elasticsearch\src\lib\log.js:68:25) at Function.EventEmitter.listenerCount (events.js:442:20) at Log.listenerCount (C:\Users\Dell\AppData\Local\Temp\fbfn_10872H41uMk66c53o\node_modules\elasticsearch\src\lib\log.js:68:25) 

在Github上的一条评论中,我发现了一个修正:它让我在我的代码中的任何地方添加这个:

 var EventEmitter = require('events').EventEmitter; var Log = require('./node_modules/elasticsearch/src/lib/log'); Log.prototype.listenerCount = EventEmitter.prototype.listenerCount; 

现在我得到一个错误:

 Error: unknown error at respond (/user_code/node_modules/elasticsearch/src/lib/transport.js:234:15) at checkRespForFailure (/user_code/node_modules/elasticsearch/src/lib/transport.js:200:7) at HttpConnector.<anonymous> (/user_code/node_modules/elasticsearch/src/lib/connectors/http.js:155:7) at IncomingMessage.wrapper (/user_code/node_modules/elasticsearch/node_modules/lodash/index.js:3095:19) at emitNone (events.js:91:20) at IncomingMessage.emit (events.js:185:7) at endReadableNT (_stream_readable.js:974:12) at _combinedTickCallback (internal/process/next_tick.js:74:11) at process._tickDomainCallback (internal/process/next_tick.js:122:9) Error: unknown error at respond (/user_code/node_modules/elasticsearch/src/lib/transport.js:234:15) at checkRespForFailure (/user_code/node_modules/elasticsearch/src/lib/transport.js:200:7) at HttpConnector.<anonymous> (/user_code/node_modules/elasticsearch/src/lib/connectors/http.js:155:7) at IncomingMessage.wrapper (/user_code/node_modules/elasticsearch/node_modules/lodash/index.js:3095:19) at emitNone (events.js:91:20) at IncomingMessage.emit (events.js:185:7) at endReadableNT (_stream_readable.js:974:12) at _combinedTickCallback (internal/process/next_tick.js:74:11) at process._tickDomainCallback (internal/process/next_tick.js:122:9) 

如何解决这个问题?

编辑

我按照第一个答案中的build议更新了elasticsearch。 现在我得到的错误:

  Error: [mapper_parsing_exception] failed to parse at respond (/user_code/node_modules/elasticsearch/src/lib/transport.js:307:15) at checkRespForFailure (/user_code/node_modules/elasticsearch/src/lib/transport.js:266:7) at HttpConnector.<anonymous> (/user_code/node_modules/elasticsearch/src/lib/connectors/http.js:159:7) at IncomingMessage.bound (/user_code/node_modules/elasticsearch/node_modules/lodash/dist/lodash.js:729:21) at emitNone (events.js:91:20) at IncomingMessage.emit (events.js:185:7) at endReadableNT (_stream_readable.js:974:12) at _combinedTickCallback (internal/process/next_tick.js:74:11) at process._tickDomainCallback (internal/process/next_tick.js:122:9) 

  1. 确保您使用的是最新版本的弹性search: npm install elasticsearch 。 在你的package.json文件中添加正确的依赖项,它应该是最近版本的弹性search,或者,使用commad, npm install elasticsearch@13.2.0或者其他任何版本。
  2. 您不需要实际覆盖Log.prototype.listenerCountLog.prototype.listenerCount已经在内部为您执行此操作(因此,调用堆栈recursion)。 所以,删除这一行:

Log.prototype.listenerCount = EventEmitter.prototype

此外,虽然这与您的问题无关…在要求path中包含./node_modules是多余的。 节点有一个内置的模块search机制,并为你做这个。