con.connect 不是函数:使用 Knex.js、express-session、pg 和 connect-pg-simple

con.connect is not a function: using Knex.js, express-session, pg and connect-pg-simple

我正在使用 express-session、connect-pg-simple、passport.js、Knex.js、pg 和 PostgreSQL 创建一个站点,目前我的会话存储似乎存在问题或启动服务器时的数据库连接。

我可以启动我的服务器,但我也在我的控制台中收到此消息:

Failed to prune sessions: con.connect is not a function

我不知道这意味着什么,因为我在我编写的代码中没有任何地方 'con.connect'。我在网上找不到任何解释或解决方案,但我推测它必须与我的数据库和会话存储之间的连接有关。

这是我的 knexfile 的样子:

const path = require('path');
require('dotenv').config({ path: path.join(__dirname, '.env.development') });

const dbMode = 
   process.env.VITE_ENV === 'development' ? {
    client: "pg",
    connection: {
      host: 'localhost',
      port: 5432,
      user: process.env.VITE_DB_USER,
      password: process.env.VITE_DB_PASS,
      database: process.env.VITE_DB_NAME,
      charset: 'utf8'
    },
    migrations: {
      directory: './server/db/migrations',
      tableName: "knex_migrations"
    },
    seeds: {
      directory: './server/db/seeds'
    }
  } : {
    client: "pg",
    connection: process.env.DATABASE_URL,
    ssl: { require: true }
}

module.exports = dbMode;

这是我的会话文件:

const path = require('path');
const dbCon = require('../../knexfile');
require('dotenv').config({ path: path.join(__dirname, '..', '..', '.env.development') });
const express_session = require('express-session');
const pgSession = require('connect-pg-simple')(express_session);

const theSecret = process.env.VITE_SESSION_SECRET;

const session = express_session({
    store: new pgSession({ tableName: 'sessions', conObject: dbCon }),
    secret: theSecret,
    resave: false,
    saveUninitialized: false,
    cookie: { maxAge: 1000 * 60 * 60 * 24 },
})

module.exports = session;

我的数据库文件:

const knex = require('knex');
const dbConfig = require('../../knexfile');
const db = knex(dbConfig);

module.exports = db;

最后是我的 initServer.js 文件:

const express = require('express');
const path = require('path');
const PORT = process.env.PORT || 5000;
const app = express();
const cors = require('cors');
const session = require('./db/session');
require('dotenv').config({ path: path.join(__dirname, '..', '.env') });
const { passport } = require('./passport');

app.use(cors({
    origin: process.env.VITE_CORS_ORIGIN,
    credentials: true
}));

app.use(express.json());
app.use(express.urlencoded({ extended: false }));
app.use(session);

app.use(passport.initialize());
app.use(passport.session());

app.use(require('./routes'));

app.use(function(req, res, next) {
    res.status(404).send("Unable to find requested resource.")
});

app.use((err, req, res, next) => {
    if (err) {
        req.logout();
        next();
    }
    res.status(err.status || 500).send(err.message);
});

app.listen(PORT, () => {
    console.log(`Listening on port ${PORT}`)
});

没有正确的错误消息,所以我真的不知道是什么导致我的会话存储或连接失败。

非常感谢您帮助解决这个问题,网上似乎没有太多信息。

我不完全确定问题的确切原因是什么,但它一定与 Knex.js 和 connect-pg-simple 之间的某种交互有关。

通过卸载 connect-pg-simple 并将其替换为更适合 Knex 的替代方案(即 connect-session-knex),我能够让会话存储正常启动。