Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js Express.js应用程序未使用server.close()完全关闭_Node.js_Mongodb_Express_Application Shutdown - Fatal编程技术网

Node.js Express.js应用程序未使用server.close()完全关闭

Node.js Express.js应用程序未使用server.close()完全关闭,node.js,mongodb,express,application-shutdown,Node.js,Mongodb,Express,Application Shutdown,我正在尝试在应用程序关闭时正确关闭MongoDB连接。代码如下: var express=require('express')) ,http=require('http') ,mongoose=require('mongoose') ,path=require('path'); var-app=express(); 应用程序集('port',process.env.port | | 3000); 猫鼬mongodb://localhost/test'); //一些post和get处理程序等(为缩

我正在尝试在应用程序关闭时正确关闭MongoDB连接。代码如下:

var express=require('express'))
,http=require('http')
,mongoose=require('mongoose')
,path=require('path');
var-app=express();
应用程序集('port',process.env.port | | 3000);
猫鼬mongodb://localhost/test');
//一些post和get处理程序等(为缩短输出而删除)
var server=app.listen(app.get('port'),function(){
console.log('Express server监听端口'+app.get('port'));
});
函数清理(){
server.close(函数(){
log(“关闭剩余的连接”);
mongoose.connection.close();
process.exit();
});
setTimeout(函数(){
控制台错误(“无法及时关闭连接,强制关闭”);
过程。退出(1);
}, 30*1000);
}
进程上('SIGINT',清除);
进程。on('SIGTERM',清除);
当应用程序第一次启动时,一切正常。当我在启动后点击
Ctrl-c
时,它会完全关闭,
关闭剩余的连接。
消息。但是,一旦应用程序与数据库交互,甚至提供静态页面,并且我尝试在之后关闭它,它就会退出,并出现以下错误:

net.js:1225
抛出新错误(“未运行”);
^
错误:未运行
在Server.close(net.js:1225:11)
在process.cleanup(/app.js:77:12)
位于process.EventEmitter.emit(events.js:92:17)
在Signal.wrap.onsignal(node.js:756:46)
8月22日15:15:28-[nodemon]退出

知道是什么导致了这个错误以及我如何修复它吗?

当调用server.close时,会检查两个属性

   handle<tcp handle>
   connections
仅当handle==null和connections==0时,传递给close的回调才会被调用

案例:服务器启动并发送信号,无服务

在关闭之前

  handle === TCP handle.
  connection===0;
  handle === TCP.handle;
  connection===1;
  handle === null;
  connection===1;
关门后 句柄===null; 连接===0

回调被调用

案例:服务器启动并发送信号后请求服务器

在关闭之前

  handle === TCP handle.
  connection===0;
  handle === TCP.handle;
  connection===1;
  handle === null;
  connection===1;
关门后 句柄===null; 连接===1

没有触发回调

第二次按ctrl-c时

在关闭之前

  handle === TCP handle.
  connection===0;
  handle === TCP.handle;
  connection===1;
  handle === null;
  connection===1;

由于handle===null,检查会抛出您看到的错误。

我不认为设置服务器。_connections=0实际上会关闭连接。它只满足执行回调的条件

您可能想尝试以下方法:

//你以前是怎么拥有它的。。。
var套接字=[];
server.on('connection',函数(socket){
插座。推(插座);
});
函数清理(){
server.close(函数(){
log(“关闭剩余的连接”);
//mongoose.connection.close();可能需要对此进行注释
process.exit();
});
//添加此部件以手动销毁所有连接。
sockets.forEach(函数(套接字){
socket.destroy();
});
//setTimeout()。。。
}

服务器打开连接的原因是您正在发送
连接:保持活动
标题

Morgan的回答干净地关闭了服务器上的所有连接,断开了所有客户端的连接


如果您只是在测试应用程序,并且希望在测试之前/之后完全关闭它,我建议发送
连接:close
标题和
服务器。close()
将按预期工作。

在提供静态页面后,是否需要按两次ctrl-c键才能看到此错误,而不是一次没有完成服务。否,只有一个
Ctrl-c
。服务器没有关闭的原因是剩余的套接字处于打开状态。你必须跟踪它们并逐一关闭它们。要更好地理解该过程并学习如何管理套接字,请阅读。那么,如何确保所有连接都正确关闭?我认为关闭DB连接就是所需的全部?一种简单的方法是,在cleanup函数中,将以下语句放在server之前。close(fn)server.connections=0;谢谢,这似乎管用。但是,
server.connections
似乎已被弃用。关闭应用程序时返回以下消息:
connections属性已弃用。使用getConnections()方法
。您知道如何使用此方法实现与上面指定的相同的功能吗?请尝试服务器。_connections=0警告:这是一个等待发生的内存泄漏。
sockets
数组无限增长。这是真的。使用http.Agent和