문제

Right now i'm storing my session data in the "memory store" which comes bundled with connect(express). But I want/have to change this for production.

The application is using mongodb and I installed mongoose to handle all db-communications.

e.g. Connect to the DB after initializing my app:

var mongo = require('mongoose');
mongo.connect('mongodb://localhost/myDb');
mongo.connection.on('open', function () {
  app.listen(3000);
}

I found the connect-mongodb module, but I don't know how to implement it using mongoose, or if it's actually possible? I need to add something like this:

var mongoStore = require('connect-mongodb');
// ...
app.use(express.session({
  secret: 'topsecret',
  maxAge: new Date(Date.now() + 3600000),
  store: new mongoStore({ db: 'myDb' })
}));

or do I have to define my db connection a second time using the mongodb-module directly?

도움이 되었습니까?

해결책

in the end i'm using a bit of every answer that was given before:

  • i switched from connect-mongodb to connect-mongo module
  • i'm using a general conf object to store my configuration data
  • there are two db connections because it's easier to handle for me (maybe changed later on, if/when a new version of mongoose/express comes out)

requirements:

var express = require('express'),
    MongoStore = require('connect-mongo')(express),
    mongo = require('mongoose');

conf object:

var conf = {
  db: {
    db: 'myDb',
    host: '192.168.1.111',
    port: 6646,  // optional, default: 27017
    username: 'admin', // optional
    password: 'secret', // optional
    collection: 'mySessions' // optional, default: sessions
  },
  secret: '076ee61d63aa10a125ea872411e433b9'
};

then i can configure it like this:

app.configure(function(){
  // ...
  app.use(express.cookieParser());
  app.use(express.session({
    secret: conf.secret,
    maxAge: new Date(Date.now() + 3600000),
    store: new MongoStore(conf.db)
  }));
  // important that this comes after session management
  app.use(app.router);
  // ...
});

and finally connect to mongodb a second time using mongoose:

var dbUrl = 'mongodb://';
dbUrl += conf.db.username + ':' + conf.db.password + '@';
dbUrl += conf.db.host + ':' + conf.db.port;
dbUrl += '/' + conf.db.db;
mongo.connect(dbUrl);
mongo.connection.on('open', function () {
  app.listen(3000);
});

다른 팁

Please include

app.use(express.cookieParser());

directly before

app.use(express.session({

Otherwise throws error as below,

TypeError: Cannot read property 'connect.sid' of undefined

It looks like you could do this to setup connect-mongodb assuming your mongoose connection code above is run earlier:

app.use(express.session({
  secret: 'topsecret',
  maxAge: new Date(Date.now() + 3600000),
  store: new mongoStore({ db: mongoose.connections[0].db })
}));

So connect-mongodb does not use Mongoose, it uses the node-mongodb-native driver (i.e.: npm install mongodb). Mongoose also depends on this driver, so it should be present.

Looking at the code directly, you have to provide your DB connection information as a MongoStore object:

store: new mongoStore({ host: 'session_server', port: 27017, db: 'seesion', collection: 'sessions' })

Typically for this, you'll want to have some "config" object or variable that can be dynamically loaded (dev vs test vs prod). Then you pull the host/port/db/auth off of that config object.

For express 4x:

var express = require('express'),
    session = require('express-session'),
    MongoStore = require('connect-mongo')(session),
    mongo = require('mongoose');

var conf = {
  db: {
    db: 'myDb',
    host: '192.168.1.111',
    port: 6646,  // optional, default: 27017
    username: 'admin', // optional
    password: 'secret', // optional
    collection: 'mySessions' // optional, default: sessions
  },
  secret: '076ee61d63aa10a125ea872411e433b9'
};

app.configure(function(){
  app.use(express.cookieParser());
  app.use(session({
    secret: conf.secret,
    maxAge: new Date(Date.now() + 3600000),
    store: new MongoStore(conf.db)
  }));
});

var dbUrl = 'mongodb://';
dbUrl += conf.db.username + ':' + conf.db.password + '@';
dbUrl += conf.db.host + ':' + conf.db.port;
dbUrl += '/' + conf.db.db;
mongo.connect(dbUrl);
mongo.connection.on('open', function () {
  app.listen(3000);
});

session has been moved to it's own module, so you need to require it and use session when configuring the MongoStore.

You can pass in an object of connection details (host, username, password, etc.).

You can also pass in a connection url like mongodb://user:pass@host.com/db_name.

Both those methods will automatically start a new connection, regardless of whether or not you already have or will start a mongoose connection.

In the latest code, you can pass in a handle to an existing connection, an instance of mongodb.Db. With mongoose, this would be mongoose.connection.db. However, this code isn't in an actual release, and when I tried it, it didn't work. Probably not ready to be used yet (or untested).

I'm sure if you wait for the next release, you'll be able to pass in an existing mongoose connection. In the mean time you'll just need to accept having two connections, one from mongoose and one from connect-mongodb.

I got the connection info from https://github.com/tedeh/connect-mongodb and I got the handle information from viewing the source (relevant commit).

I just stumble across mongoose-session

Very lightweight and worked seamlessly for me. From github...

Installation

npm install mongoose-session

Use

var express = require('express');

var mongoose = require('mongoose');
mongoose.connect('mongodb://localhost/db');

var app = express();

app.use(require('express-session')({
    key: 'session',
    secret: 'SUPER SECRET SECRET',
    store: require('mongoose-session')(mongoose)
}));
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top