2015-11-28 15 views
5

Sto cercando di ottenere sessioni espresse per lavorare con postgres. Dopo un paio d'ore di debug, ho risolto tutti i problemi tranne uno. Tutto funziona ma seguente:Sequelize e express-session model

Se corro questa query all'interno pgAdmin mie sessioni di funzionare correttamente

CREATE TABLE "sessions" (
    "sid" varchar NOT NULL COLLATE "default", 
    "sess" json NOT NULL, 
    "expire" timestamp(6) NOT NULL 
) 
WITH (OIDS=FALSE); 
ALTER TABLE "sessions" ADD CONSTRAINT "session_pkey" PRIMARY KEY ("sid") 
NOT DEFERRABLE INITIALLY IMMEDIATE; 

Se creo modello con sequelize allora non salva le sessioni. Sono certo ed è ovvio che mi mancano alcune parti nella mia definizione del modello e apprezzerei qualsiasi input.

var Sessions = database.define('sessions', { 
     sid: { 
      type: Sequelize.STRING, 
      primaryKey: true 
     }, 
     expire: { 
      type: Sequelize.DATE, 
      allowNull: true 
     }, 
     sess: Sequelize.JSON 
    }); 
    return Sessions; 

resto del codice lavorare con questo

var pgSession = require('connect-pg-simple')(expressSession), 
sessionSettings = { 
    store: new pgSession ({ 
     conString: 'postgres://' + dbConfig.user +':' + dbConfig.password+ '@' + dbConfig.host+ ':5432/' + dbConfig.database, 
     tableName : 'sessions' 
    }), 
    secret: 'whatevergoeshere', 
    resave: false, 
    saveUninitialized: false, 
    cookie: { 
     maxAge: 7*24*60*60*1000 
    } 
}; 
app.use(expressSession(sessionSettings)); 

non ho idea di come includere le parti mancanti e la documentazione sequelize è sia per brevi sul tema, o non ho avuto abbastanza sonno

Il resto del codice è disponibile su richiesta, ma è piuttosto certo che non abbia alcun effetto in quanto se non imposto la sincronizzazione con il modello sequelize e l'utilizzo della query, tutto funziona.

Inoltre, ecco come si guarda attraverso pgAdmin, quello superiore è creato con query in pgAdmin, quello in basso è stato creato da sequelize

PostgreSQL

+0

Perché non basta usare [connect-session sequelize] (https://github.com/mweibel/connect-session-sequelize)? –

+0

Ho aggiornato la mia domanda per riflettere il tuo commento –

+0

Aggiornato con codice sorgente su un altro progetto in cui ora ho lo stesso problema. –

risposta

1

Sequelize sta creando per default le colonne createdAt e updatedAt, che non sono autorizzati a essere NULL. Usando il modulo "connect-pt-simple" per aggiungere la riga, fallisce silenziosamente poiché non fornisce valori per questi due campi. O gestire il caso da soli e aggiornare questi valori oppure nel modello impostare questi due con la proprietà "allowNull: true" o aggiungere un valore predefinito. Naturalmente la prima opzione è preferibile e potrebbe essere utile in futuro.

1

Affinché auto-generare tabella di sessione con "connect-session-sequelize", è necessario richiamare sync() metodo su un'istanza SequelizeStore

var session = require('express-session'); 
var Sequelize = require('sequelize'); 
var db = new Sequelize('test', 'root', '****'); 
var SequelizeStore = require('connect-session-sequelize')(session.Store); 

var sessionStore = new SequelizeStore({ 
    db: db, 
    checkExpirationInterval: 15 * 60 * 1000, 
    expiration: 7 * 24 * 60 * 60 * 1000 
}); 

app.use(session({ 
    secret: 'keyboard cat', 
    resave: false, saveUninitialized: false, 
    store: sessionStore 
})); 

sessionStore.sync()