【问题标题】:Sequelize and express-session modelSequelize 和 express-session 模型
【发布时间】:2016-03-02 11:42:26
【问题描述】:

我正在尝试让快速会话与 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 模型同步并使用查询,一切正常。

另外,这是通过 pgAdmin 的外观,顶部是在 pgAdmin 中使用查询创建的,底部是通过 sequelize 创建的

【问题讨论】:

  • 你为什么不直接使用connect-session-sequelize?
  • 我更新了我的问题以反映您的评论
  • 更新了另一个项目的源代码,我现在遇到了同样的问题。
  • 很遗憾,我不是 Sequelize 方面的专家。在我的项目中,我使用pg-promise 进行数据库访问,加上connect-pg-simple 进行会话,如果这对您有任何帮助的话。

标签: node.js postgresql session express


【解决方案1】:

Sequelize 默认创建 createdAt 和 updatedAt 列,不允许为 NULL。通过使用模块“connect-pt-simple”添加行,它会静默失败,因为它没有为这两个字段提供值。 要么自己处理这种情况并更新这些值,要么在你的模型中使用属性“allowNull:true”设置这两个,或者添加一个默认值。 当然首选第一个选项,将来可能会派上用场。

【讨论】:

    【解决方案2】:

    为了使用 "connect-session-sequelize" 自动生成会话表,您需要在 SequelizeStore 实例上调用 sync() 方法

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-10-18
      • 2018-07-20
      • 2018-03-07
      • 1970-01-01
      • 2020-11-09
      • 2014-06-27
      • 2019-05-14
      相关资源
      最近更新 更多