connect-mongo每秒创build一个新的会话

我有我的nodejs应用程序托pipe在Openshift上。 这是我的规格:

节点v0.10.35,expressionv3.4.8

我的package.json依赖关系:

"dependencies": { "angular-loading-bar": "^0.9.0", "async": "^2.0.0-rc.5", "bcrypt-nodejs": "0.0.3", "body-parser": "~1.0.0", "connect-flash": "^0.1.1", "connect-mongo": "^1.2.0", "cookie-parser": "~1.0.0", "ejs": "^2.4.1", "express": "~3.4.4", "lodash": "^4.12.0", "method-override": "~1.0.0", "mongodb": "~2.x", "mongoose": "~4.4.12", "morgan": "~1.0.0", "nodemailer": "^2.3.2", "passport": "^0.3.2", "passport-local": "^1.0.0", "recaptcha2": "^1.0.8" }, 

这里是我的server.js

 #!/bin/env node var express = require('express'); var fs = require('fs'); var mongoose = require('mongoose'); var passport = require('passport'); var flash = require('connect-flash'); var morgan = require('morgan'); var cookieParser = require('cookie-parser'); var bodyParser = require('body-parser'); var MongoStore = require('connect-mongo/es5')(express); var app = express(); var server_port = process.env.OPENSHIFT_NODEJS_PORT || 8080; var server_ip_address = process.env.OPENSHIFT_NODEJS_IP || '0.0.0.0'; //MongoD mongodb_connection_string = process.env.OPENSHIFT_MONGODB_DB_URL + "tenders"; mongoose.connect(mongodb_connection_string); var dbconn = mongoose.connection; dbconn.on('error', console.error.bind(console, 'connection error:')); dbconn.once('open', function(){ console.log('Connected to Mongoose Database.'); }); // Close MongoD connection when app is terminated process.on('SIGINT', function (){ mongoose.disconnect(); dbconn.close(function (){ console.log("Server halted: Mongoose default connection disconnected."); process.exit(0); }); }); /* Configuration */ app.set('view engine', 'ejs'); // set up ejs for templating /* Middlewares */ app.use(express.static(__dirname + "/views")); app.use(express.static(__dirname + "/public")); // set up our express application app.use(morgan('dev')); // log every request to the console app.use(bodyParser()); // get information from html forms app.use(cookieParser()); // read cookies (needed for auth) /** Persistent database backed session **/ app.use(express.session({ secret: process.env.SECRET, store: new MongoStore({mongooseConnection : mongoose.connection}) })); app.use(passport.initialize()); app.use(passport.session()); app.use(flash()); require('./routes/routes')(app, passport); require('./config/passport')(passport); configuration app.use(function(req, res) { res.redirect('/') }); app.use(function (err, req, res, next) { if (err.name === 'UnauthorizedError') { res.status(401); res.json({"message" : err.name + ": " + err.message}); } }); /* Start server */ app.listen(server_port, server_ip_address, function(){ console.log("Listening on " + server_ip_address + ":" + server_port); }); 

问题是connect-mongo每秒钟都在创build一个新的会话,因为我可以通过计算数据库中会话集合中的条目数量来看到这一点。 即使当前没有活跃用户正在使用该网站,会议也正在创build。 这是正常的吗?

编辑 :这是由于我使用中间件来检查用户是否使用护照isauthenticated方法的大部分API调用login。 但是奇怪的是,即使没有用户向服务器发出请求时也会调用它,正如您从下面的node.log中看到的一样,这种情况会导致redirect

 GET / 302 3ms - 40b GET / 302 3ms - 40b GET / 302 2ms - 40b GET / 302 2ms - 40b GET / 302 3ms - 40b GET / 302 20ms - 40b GET / 302 3ms - 40b GET / 302 2ms - 40b GET / 302 3ms - 40b GET / 302 4ms - 40b 

如果您正在使用express-session> = 1.10.0并且不希望在用户刷新页面的每一次都重新保存数据库上的所有会话,则可以通过限制一段时间来延迟更新会话。 因为你使用的是更新版本的connect-mongo和express版本的老版本不能100%确定,但是我认为这是因为cookie或者未初始化的会话。

 // Configuring sessions var session = require('express-session'); var MongoStore = require('connect-mongo')(session); app.use(session({ secret: 'JohnSecret', saveUninitialized: false, // don't create session until something stored resave: false, //don't save session if unmodified store: new MongoStore({ url: 'mongodb://localhost/John', autoRemove: 'interval', autoRemoveInterval: 10 // In minutes. Default }) })); 

好吧,这是HAProxy不断检查后端服务器,看到它的工作和问题。 在这样做,它正在创build一个会议秒,混乱我的数据库。 所以这里是我的( )修复:

  1. 创build一个通过销毁每个会话来处理HAProxy的httpchk的api /ping

    app.get('/ping', function(req, res){ req.session.destroy(); res.send(200); });

  2. configurationhaproxy/conf来更改option httpchk GET /option httpchk GET /ping

  3. 使用RHC rhc cartridge-restart --cartridge haproxy重新启动HAProxy盒式rhc cartridge-restart --cartridge haproxy