• Stars
    star
    212
  • Rank 186,122 (Top 4 %)
  • Language
    JavaScript
  • Created over 11 years ago
  • Updated about 1 month ago

Reviews

There are no reviews yet. Be the first to send feedback to the community and the maintainers!

Repository Details

Sequelize SessionStore for Express/Connect

Connect Session Store using Sequelize

Build Status

connect-session-sequelize is a SQL session store using Sequelize.js.

Installation

Please note that the most recent version requires express 4. If you use express 3 you should install version 0.0.5 and follow the instructions in the previous README.

$ npm install connect-session-sequelize

Options

  • db a successfully connected Sequelize instance
  • table (optional) a table/model which has already been imported to your Sequelize instance, this can be used if you want to use a specific table in your db
  • modelKey (optional) a string for the key in sequelize's models-object but it is also the name of the class to which it references (conventionally written in Camelcase) that's why it is "Session" by default if table is not defined.
  • tableName (optional) a string for naming the generated table if table is not defined. Default is the value of modelKey.
  • extendDefaultFields (optional) a way add custom data to table columns. Useful if using a custom model definition
  • disableTouch (optional) When true, the store will not update the db when receiving a touch() call. This can be useful in limiting db writes and introducing more manual control of session updates.

Usage

With connect

const connect = require("connect");
// for express, just call it with 'require('connect-session-sequelize')(session.Store)'
const SequelizeStore = require("connect-session-sequelize")(
  connect.session.Store
);

connect().use(
  connect.session({
    store: new SequelizeStore(options),
    secret: "CHANGEME",
  })
);

With express 4:

// load dependencies
var express = require("express");
var Sequelize = require("sequelize");
var session = require("express-session");

// initalize sequelize with session store
var SequelizeStore = require("connect-session-sequelize")(session.Store);

// create database, ensure 'sqlite3' in your package.json
var sequelize = new Sequelize("database", "username", "password", {
  dialect: "sqlite",
  storage: "./session.sqlite",
});

// configure express
var app = express();
app.use(
  session({
    secret: "keyboard cat",
    store: new SequelizeStore({
      db: sequelize,
    }),
    resave: false, // we support the touch method so per the express-session docs this should be set to false
    proxy: true, // if you do SSL outside of node.
  })
);
// continue as normal

If you want SequelizeStore to create/sync the database table for you, you can call sync() against an instance of SequelizeStore along with options if needed. This will run a sequelize sync() operation on the model for an initialized SequelizeStore object :

var myStore = new SequelizeStore({
  db: sequelize,
});
app.use(
  session({
    secret: "keyboard cat",
    store: myStore,
    resave: false,
    proxy: true,
  })
);

myStore.sync();

Session expiry

Session records are automatically expired and removed from the database on an interval. The cookie.expires property is used to set session expiry time. If that property doesn't exist, a default expiry of 24 hours is used. Expired session are removed from the database every 15 minutes by default. That interval as well as the default expiry time can be set as store options:

new SequelizeStore({
  ...
  checkExpirationInterval: 15 * 60 * 1000, // The interval at which to cleanup expired sessions in milliseconds.
  expiration: 24 * 60 * 60 * 1000  // The maximum age (in milliseconds) of a valid session.
});

Expiration interval cleanup: stopExpiringSessions

As expirations are checked on an interval timer, connect-session-sequelize can keep your process from exiting. This can be problematic e.g. in testing when it is known that the application code will no longer be used, but the test script never terminates. If you know that the process will no longer be used, you can manually clean up the interval by calling the stopExpiringSessions method:

// assuming you have set up a typical session store, for example:
var myStore = new SequelizeStore({
  db: sequelize,
});

// you can stop expiring sessions (cancel the interval). Example using Mocha:
after("clean up resources", () => {
  myStore.stopExpiringSessions();
});

Add custom field(s) as a column

The extendDefaultFields can be used to add custom fields to the session table. These fields will be read-only as they will be inserted only when the session is first created as defaults. Make sure to return an object which contains unmodified data and expires properties, or else the module functionality will be broken:

sequelize.define("Session", {
  sid: {
    type: Sequelize.STRING,
    primaryKey: true,
  },
  userId: Sequelize.STRING,
  expires: Sequelize.DATE,
  data: Sequelize.TEXT,
});

function extendDefaultFields(defaults, session) {
  return {
    data: defaults.data,
    expires: defaults.expires,
    userId: session.userId,
  };
}

var store = new SequelizeStore({
  db: sequelize,
  table: "Session",
  extendDefaultFields: extendDefaultFields,
});

Contributing/Reporting Bugs

Try to replicate your issue using mweibel/connect-session-sequelize-example and add that as a link to your issue.

This way it's much simpler to reproduce and help you.

License

MIT

More Repositories

1

facebook.ex

Facebook Graph API Wrapper written in Elixir
Elixir
138
star
2

lcov-result-merger

Merges multiple lcov results into one
JavaScript
100
star
3

gitreleases

Git Releases allows you to directly link to the assets of your latest release on GitHub.
Go
66
star
4

sdpToJingle

WebRTC SDP Message to Jingle Conversion
JavaScript
33
star
5

php-to-go

Library for generating Go structs using sheriff out of PHP models which use JMS Serializer.
PHP
13
star
6

tcp-server.ex

Elixir TCP Server based on OTP principles
Elixir
10
star
7

react-date-picker

A manual fork from zippyui/react-date-picker because the repo disappeared
JavaScript
8
star
8

DidIPassHSR

Sends you notifications as soon as grades are on hsr
Ruby
7
star
9

esrscan

iOS app for scanning swiss invoices
Swift
6
star
10

ejabberd-module-guide

Guide for creating modules
Erlang
6
star
11

xmpp-server-benchmarks

XMPP Server Benchmarks with various scenarios and tools to setup the servers (uses tsung)
Ruby
5
star
12

connect-session-sequelize-example

Basic repository for connect-session-sequelize
JavaScript
3
star
13

fmarshal

marshals a struct type into a slice of CLI arguments.
Go
2
star
14

dotnix

dotfiles nix based
Vim Script
2
star
15

esrscan-desktop

Desktop app for ESRScan
JavaScript
2
star
16

node-epmd-client

Node.js EPMD client
JavaScript
2
star
17

hsrPlan

Plan your studies @ University of applied sciences Rapperswil (HSR)
Ruby
1
star
18

node-erlang

JavaScript
1
star
19

dotfiles

for my very own convenience
Shell
1
star
20

ejabberd-module-bootstrap

Rebar base project for creating ejabberd modules
Erlang
1
star
21

node-etf

Erlang External Term Format parser
JavaScript
1
star