cURL有效但浏览器不适用于节点应用程序

时间:2016-03-31 16:42:45

标签: node.js mongodb mongoose

我正在运行通过mongooseJS驱动程序连接到MongoDB的NodeJS应用程序。它托管在AWS上,由OpsWorks使用Monit进行管理,以保持应用程序的活跃。

我遇到的问题是,当我第一次部署我的应用程序时,它运行正常。但是一小时后,如果我尝试在浏览器中加载应用程序,请求会超时,我从来没有收到服务器的响应。

我认为该应用程序崩溃了并且monit不起作用,但事实并非如此。即使我无法通过浏览器或使用Postman ping服务器,该应用程序实际上正在运行,我可以使用cURL成功ping服务器。

当我重新启动应用程序时,它至少会再次开始工作。

为什么cURL有效,但浏览器没有?

1 个答案:

答案 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
    );
});