Express.js应用程序没有使用server.close()干净地关闭

mar*_*t1n 9 application-shutdown mongodb node.js express

我正在尝试在关闭应用程序时正确关闭MongoDB连接.这是代码:

var express = require('express')
  , http = require('http')
  , mongoose = require('mongoose')
  , path = require('path');

var app = express();

app.set('port', process.env.PORT || 3000);

mongoose.connect('mongodb://localhost/test');

// some post and get handlers etc. (removed for shorter output)

var server = app.listen(app.get('port'), function(){
    console.log('Express server listening on port ' + app.get('port'));
});

function cleanup () {
    server.close(function () {
        console.log("Closed out remaining connections.");
        mongoose.connection.close();
        process.exit();
    });

    setTimeout( function () {
        console.error("Could not close connections in time, forcing shut down");
        process.exit(1);
    }, 30*1000);
}

process.on('SIGINT', cleanup);
process.on('SIGTERM', cleanup);
Run Code Online (Sandbox Code Playgroud)

当应用程序第一次启动时,一切都很顺利.当Ctrl-c它在它启动后立即点击时,它会完全关闭并显示Closed out remaining connections.消息.但是,只要应用程序与数据库交互或甚至提供静态页面,我尝试在此之后关闭它,它将退出并出现以下错误:

net.js:1225
    throw new Error('Not running');
          ^
Error: Not running
    at Server.close (net.js:1225:11)
    at process.cleanup (<...>/app.js:77:12)
    at process.EventEmitter.emit (events.js:92:17)
    at Signal.wrap.onsignal (node.js:756:46)
22 Aug 15:15:28 - [nodemon] exiting
Run Code Online (Sandbox Code Playgroud)

是什么原因造成了这个错误以及我如何解决它?

Cha*_*ndu 4

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

   handle<tcp handle>
   connections
Run Code Online (Sandbox Code Playgroud)

server.close 的负责代码片段负责此错误;

  if (!this._handle) {
    // Throw error. Follows net_legacy behaviour.
    throw new Error('Not running');
  }
Run Code Online (Sandbox Code Playgroud)

仅当handle===null 且connections ===0 时,才会调用传递给close 的回调。

情况:服务器已启动并发送信号但没有服务。

调用 close 之前;

  handle === TCP handle.
  connection===0;
Run Code Online (Sandbox Code Playgroud)

关闭后句柄===null; 连接===0;

回调被调用。

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

调用 close 之前;

  handle === TCP.handle;
  connection===1;
Run Code Online (Sandbox Code Playgroud)

关闭后句柄 === null; 连接===1;

没有回调被触发。

第二次按 ctrl-c 时

调用 close 之前;

  handle === null;
  connection===1;
Run Code Online (Sandbox Code Playgroud)

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