开发者

Node.js connect-mongo database connection problem

This is a very weird problem with "connect-mongo"

In my server, I have two scripts.

1) create the express server with session with Mongo DataStore: It has no problem for connection or creating the session.

MongoStore = require('connect-mongo'),
app = require('express').createServer(


  express.session({ secret: cfg.wiki_session_secret,
    store:new MongoStore({  
          db: 'mydatabase',
      host: '10.10.10.10',
      port: 27017
    })
  })
);

2) just create the store without express:

var MongoStore = require('connect-mongo');

var options = {db: 'mydatabase'}; 
var store = new MongoStore(options, function() {
    var db = new mongo.Db(options.db, new mongo.Server('10.10.10.10', 27017, {}));

    db.open(function(err) {
      db.collection('sessions', function(err,开发者_开发知识库 collection) {
        callback(store, db, collection);
      });
    });
  });  

That will throw the connection problem:

node.js:134
        throw e; // process.nextTick error, or 'error' event on first tick
        ^
Error: Error connecting to database
    at /home/eauser/node_modules/connect-mongo/lib/connect-mongo.js:106:13
    at /home/eauser/node_modules/connect-mongo/node_modules/mongodb/lib/mongodb/db.js:79:30
    at [object Object].<anonymous> (/home/eauser/node_modules/connect-mongo/node_modules/mongodb/lib/mongodb/connections/server.js:113:12)
    at [object Object].emit (events.js:64:17)
    at Array.<anonymous> (/home/eauser/node_modules/connect-mongo/node_modules/mongodb/lib/mongodb/connection.js:166:14)
    at EventEmitter._tickCallback (node.js:126:26)

I just don't know why..


connect-mongo is a middleware for the connect framework, which express is based on.

So, you must use the middleware with the express framework or the connect framework, otherwise it won't work. It's not written to be a standalone session library.


You can go for mongoose to connect. Install using npm command

npm install mongoose

Install mongoose globally

npm install -g mongoose    

app.js

var mongoose = require("mongoose");


This module has callback in the constructor which is called when the database is connected, and the collection is initialized so it won't work as you expect.

I've the same problem than you and I wanted the same interface that you aim here. So I wrote another module called YAMS - Yet Another Mongo Store. This is an example with YAMS:

var MongoClient = require("mongodb").MongoClient;
var Yams = require('yams');

var store = new Yams(function (done) {
  //this will be called once, you must return the collection sessions.
  MongoClient.connect('mongo://localhost/myapp', function (err, db) {
    if (err) return done(err);

    var sessionsCollection = db.collection('sessions')

    //use TTL in mongodb, the document will be automatically expired when the session ends.
    sessionsCollection.ensureIndex({expires:1}, {expireAfterSeconds: 0}, function(){});

    done(null, sessionsCollection);
  });  
});

app.usage(express.session({
  secret: 'black whisky boycott tango 2013',
  store:  store
}));

This is in my opinion more flexible than the connect-mongo middleware.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜