首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >是什么导致了Node.js "MaxListenersExceededWarning“警告?

是什么导致了Node.js "MaxListenersExceededWarning“警告?
EN

Stack Overflow用户
提问于 2022-07-17 06:37:35
回答 2查看 64关注 0票数 1

我有一个简单的Express.js后端服务器:

代码语言:javascript
运行
复制
const app = require("express")();
const dotenv = require("dotenv");
const bodyParser = require("body-parser");
const cookieParser = require("cookie-parser");

const swaggerUi = require("swagger-ui-express");
const swaggerJsDocs = require("swagger-jsdoc");

const swaggerOptions = {
  definition: {
    openapi: '3.0.0',
    info: {
      title: 'API',
      version: '0.0.1',
      description: 'Api docs .'
    },
  },
  apis: ["./src/swagger/swagger.yaml"]
};
const swaggerDocs = swaggerJsDocs(swaggerOptions);

dotenv.config();

const server = require("http").createServer(app);

app.use(cookieParser());
app.use(bodyParser.json({limit: '10MB'}));
app.use(bodyParser.urlencoded({extended: true}));
app.use("/api-docs", swaggerUi.serve, swaggerUi.setup(swaggerDocs));
app.use("/", require('./src/routes'));

const port = process.env.PORT || 3001;
server.listen(port, () => console.log("API listening on port " + port + "!"));

但我一直收到这样的警告,实际上我不知道是什么原因造成的。我没有网络套接字什么的,但还是:

代码语言:javascript
运行
复制
(node:7847) MaxListenersExceededWarning: Possible EventEmitter memory leak detected. 
11 uncaughtException listeners added to [process]. 
Use emitter.setMaxListeners() to increase limit
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2022-07-17 06:59:56

这个特定的错误意味着您的代码(或您正在使用的模块)为process.on('uncaughtException', ...)事件添加了11个处理程序。

这通常是一种指示,表明一些代码反复地添加相同的事件处理程序(在其他一些事件处理程序中,例如在Express路由中),它们在这些事件处理程序中积累的时间越来越长。这可以在您自己的代码中,也可以在您的代码导入的某些模块中。

这样的事件处理程序应该只为给定的代码部分添加一次,或者应该添加,然后在不再需要时删除。

根据您在这里显示的少量代码,我猜首先要查看的是./src/routes中任何在路由处理程序中添加uncaughtException侦听器的代码。

票数 2
EN

Stack Overflow用户

发布于 2022-07-17 07:17:06

我已经找到了这个警告的原因。

在这个项目中,我使用winstonwinston-daily-rotate-file,对于每个控制器和服务(记录日志),我创建了这个记录器实例,这基本上创建了这些处理程序:

代码语言:javascript
运行
复制
const loggerInstance = createLogger({
  level: process.env.NODE_ENV !== 'production' ? 'debug' : 'info',
  format: combine(
    colorize(),
    json(),
    label({ label: data.label ? data.label : 'NONE' }),
    timestamp(),
    myFormat,
  ),
  transports: transportsConfig,
});

if (process.env.NODE_ENV !== 'production') {
  loggerInstance.add(new transports.Console({
    handleExceptions: true,
  }));
}

if (process.env.DISABLE_LOGGER === 'yes') {
  loggerInstance.silent = true;
}

return loggerInstance;
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73009684

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档