2015-11-28 351 views
5

我試圖讓快速會話與postgres一起工作。經過幾個小時的調試,我已經修復了所有問題,但只有一個。一切正常,但以下幾點:續集和快速會話模型

如果我運行裏面的pgAdmin此查詢我的會話正常工作

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; 

如果我創建模型sequelize那麼它不保存會話。我很確定,很明顯,我缺少模型定義中的一些部分,並且很感激任何輸入。

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

代碼的休息與此

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)); 

我不知道如何將缺少的部分和sequelize文件要麼是短的話題,或者我還沒有足夠的睡眠工作

其他代碼可以根據請求提供,但非常確定,它不會影響任何內容,因爲如果我不強制與sequ​​elize模型同步並使用查詢,則一切正常。

而且,這裏是它的外觀通過pgAdmin的,與在pgAdmin的查詢創建頂部一個,底部一個由sequelize

PostgreSQL

+0

你爲什麼不只是使用[連接,會話級sequelize](https://github.com/mweibel/connect-session-sequelize)? –

+0

我更新了我的問題以反映您的評論 –

+0

在另一個項目上更新了源代碼,我現在有同樣的問題。 –

回答

1

Sequelize正在創建默認createdAt和updatedAt列,創建了不允許爲NULL。通過使用模塊「connect-pt-simple」來添加行,它會靜默失敗,因爲它不會爲這兩個字段提供值。 要麼自己處理案例並更新這些值,要麼在模型中設置這兩個屬性爲「allowNull:true」,或者添加默認值。 當然,第一種選擇是首選,它可能在未來很方便。

1

爲了使自動生成會話表「連接會話-sequelize」,你需要調用同步()方法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()