我正在运行通过mongooseJS驱动程序连接到MongoDB的NodeJS应用程序。它托管在AWS上,由OpsWorks使用Monit进行管理,以保持应用程序的活跃。
我遇到的问题是,当我第一次部署我的应用程序时,它运行正常。但是一小时后,如果我尝试在浏览器中加载应用程序,请求会超时,我从来没有收到服务器的响应。
我认为该应用程序崩溃了并且monit不起作用,但事实并非如此。即使我无法通过浏览器或使用Postman ping服务器,该应用程序实际上正在运行,我可以使用cURL成功ping服务器。
当我重新启动应用程序时,它至少会再次开始工作。
为什么cURL有效,但浏览器没有?
答案 0 :(得分:1)
追逐这个问题一段时间后我终于明白了。问题是我的应用程序正在与我的mongod进程断开连接,而不是崩溃或重新连接。
如果应用程序在与数据库断开连接时退出,Monit会重新启动它,一切都会好的。
为了解决这个问题,我添加了一些逻辑,用于重新连接到数据库,如果在一段时间后没有连接,则退出应用程序。
这是我的server.js文件现在的样子:
'use strict';
//----------------------------------------------------------------------------------------------------------------------
// Dependencies
var http = require('http'),
mongoose = require('mongoose'),
chalk = require('chalk');
//----------------------------------------------------------------------------------------------------------------------
// Variables
var initialConnection = true,
connected = false,
reconnectTries = 30,
reconnectInterval = 1000;
//----------------------------------------------------------------------------------------------------------------------
// Start Server
function startServer() {
console.log(chalk.green.bold('\nSTARTING SERVER'));
// initialize express application
var app = require('./server/express.js')(mongoose);
// start http server
http.createServer(app).listen(process.env.PORT, function() {
console.log(chalk.green(' application started on port '+process.env.PORT));
});
}
//----------------------------------------------------------------------------------------------------------------------
// Stop Server
function stopServer() {
console.log(chalk.red.bold('\nSTOPPING SERVER'));
console.error(chalk.red(' '+new Date()));
if (connected) {
mongoose.connection.close(function () {
process.exit(0);
});
} else {
process.exit(0);
}
}
process.on('SIGINT', stopServer);
//----------------------------------------------------------------------------------------------------------------------
// Timestamp
console.log(chalk.bold('\n********************'));
console.log(chalk.bold('\nSTARTING APPLICATION'));
console.log(' '+new Date());
//----------------------------------------------------------------------------------------------------------------------
// Environment Variables
console.log(chalk.blue.bold('\nENVIRONMENT VARIABLES'));
[
{var: 'NODE_ENV', default: 'development'},
{var: 'PORT', default: '3000'},
{var: 'DB_CONNECTION', default: 'localhost'}
].forEach(function(env) {
if (!process.env[env.var]) {process.env[env.var] = env.default;}
console.log(chalk.blue(' '+env.var+'='+process.env[env.var]));
});
//----------------------------------------------------------------------------------------------------------------------
// Database Connection
// - http://mongoosejs.com/docs/connections.html
// - http://theholmesoffice.com/mongoose-connection-best-practice/
console.log(chalk.cyan.bold('\nCONNECTING DATABASE'));
// create connection
mongoose.connect(
'mongodb://'+process.env.DB_CONNECTION+'/signal-noise',
{
server: {
auto_reconnect: true,
reconnectTries: reconnectTries,
reconnectInterval: reconnectInterval
}
}
);
// success
mongoose.connection.on('connected', function() {
if (initialConnection) {
console.log(chalk.cyan(' connected to mongodb at ' + process.env.DB_CONNECTION));
initialConnection = false;
connected = true;
startServer();
} else {
console.log(chalk.cyan.bold('\nRECONNECTING DATABASE'));
console.log(chalk.cyan(' connected to mongodb at ' + process.env.DB_CONNECTION));
console.log(chalk.cyan(' '+new Date()));
connected = true;
}
});
// error
mongoose.connection.on('error',function (err) {
console.error(chalk.red.bold('\nERROR: Could not connect to MongoDB.'));
console.error(chalk.red(' '+err));
console.error(chalk.red(' '+new Date()));
stopServer();
});
// disconnected
mongoose.connection.on('disconnected', function () {
console.error(chalk.red.bold('\nMONGODB DISCONNECTED'));
console.error(chalk.red(' '+new Date()));
connected = false;
setTimeout(
function() { if (!connected) { stopServer(); } },
reconnectTries*reconnectInterval
);
});