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),我能够让会话存储正常启动。
我正在使用 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),我能够让会话存储正常启动。