节点、Postgres 和 Knex:SASL:SCRAM_SERVER_FIRST_MESSAGE:客户端密码必须是字符串

Node, Postgres and Knex: SASL: SCRAM_SERVER_FIRST_MESSAGE: client password must be a string

我正在使用 Node.js、React、Vite、Knex.js 和 PostgreSQL 创建站点,并且在尝试启动我的服务器并连接到我的数据库时遇到 运行 错误我不知道如何解决。我在网上四处看看,也没什么帮助。以下是相关文件的样子:

server.js

const express = require('express');
const PATH = 5000;
const app = express();
const cors = require('cors');
const session = require('./db/session');
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}`)
});

knexfile.js

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;

db.js

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

module.exports = db;

我还使用 express-session 和 connect-pg-simple 设置了一个会话存储。我也用 Passport.js.

每当我尝试启动服务器 ('node initServer.js') 时,我都会收到错误消息:

<project path>/node_modules/pg/lib/sasl.js:24
    throw new Error('SASL: SCRAM-SERVER-FIRST-MESSAGE: client password must be a string'

我已确保我所有的环境变量都正常工作并且类型正确。我已经使用 console.log() 来确认变量不是未定义的,并使用 typeof 来确认数据库密码的环境变量类型是字符串。

我使用的密码详细信息和 postgreSQL 安装与我在最近的另一个项目中使用的相同,因此我确信密码没有错误并且所有详细信息都是正确的。

我不知道我需要做什么来解决这个问题,因为密码(据我所知)已正确传递。非常感谢您的帮助。

如果您希望我展示或解释任何内容以帮助您解决此问题,请告诉我。

我找到了一个解决方案,但我不完全确定为什么这是必要的,因为在我过去完成的项目中不需要此步骤来连接到我的数据库。

事实证明问题与我的 session.js 文件有关。通过如下将我的 knexfile 中的数据库连接对象添加到 express-session,我能够绕过这个错误:

const path = require('path');
const connection = 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: connection }),
    secret: theSecret,
    resave: false,
    saveUninitialized: false,
    cookie: { maxAge: 1000 * 60 * 60 * 24 }
})

module.exports = session;

诚然,尽管这样做了,但我实际上还有另一个问题。虽然我现在实际上可以 运行 我的服务器,但出于某种原因我也收到以下消息:

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

这个我再单独提问