postgres 与 node.js 连接中的 SASL 错误

Posted

技术标签:

【中文标题】postgres 与 node.js 连接中的 SASL 错误【英文标题】:SASL error in postgres connection with node.js 【发布时间】:2021-07-24 15:13:56 【问题描述】:

尝试连接到我的数据库时出现以下错误:

Conexão estbabelecida com sucesso
Acessar http://localhost:3000
Servidor executando na porta 3000
C:\Users\lopes\Desktop\javascript\novo-projeto\ExpressEWebpack\node_modules\pg\lib\sasl.js:24
    throw new Error('SASL: SCRAM-SERVER-FIRST-MESSAGE: client password must be a string')
    ^

Error: SASL: SCRAM-SERVER-FIRST-MESSAGE: client password must be a string
    at Object.continueSession (C:\Users\lopes\Desktop\Javascript\novo-projeto\ExpressEWebpack\node_modules\pg\lib\sasl.js:24:11)
    at Client._handleAuthSASLContinue (C:\Users\lopes\Desktop\Javascript\novo-projeto\ExpressEWebpack\node_modules\pg\lib\client.js:257:10)
    at Connection.emit (events.js:315:20)
    at C:\Users\lopes\Desktop\Javascript\novo-projeto\ExpressEWebpack\node_modules\pg\lib\connection.js:114:12
    at Parser.parse (C:\Users\lopes\Desktop\Javascript\novo-projeto\ExpressEWebpack\node_modules\pg-protocol\dist\parser.js:40:17)
    at Socket.<anonymous> (C:\Users\lopes\Desktop\Javascript\novo-projeto\ExpressEWebpack\node_modules\pg-protocol\dist\index.js:11:42)
    at Socket.emit (events.js:315:20)
    at addChunk (internal/streams/readable.js:309:12)
    at readableAddChunk (internal/streams/readable.js:284:9)
    at Socket.Readable.push (internal/streams/readable.js:223:10)
[nodemon] app crashed - waiting for file changes before starting...

这是我的连接代码

require('dotenv').config();
const express = require('express');
const app = express(); 
const  Sequelize  = require('sequelize');
const sequelize = new Sequelize(process.env.DB_URL);

try 
    sequelize.authenticate();
    console.log('Conexão estbabelecida com sucesso')
catch
    console.log('Erro ao estabelecer conexão');


const session = require('express-session');
const flash = require('connect-flash');

const routes = require('./routes')
const path = require('path');


app.use(express.urlencoded(  extended:true ));

app.use(express.static(path.resolve(__dirname, 'public')));

const sessionOptions = session(
    secret:process.env.cookie_secret,
    store: new (require('connect-pg-simple')(session))(),
    resave: false,
    saveUninitialized: false,
    cookie: maxAge: 1000 * 60 * 60 * 24 * 7
);

app.use(sessionOptions);
app.use(flash());

app.set('views', path.resolve(__dirname, 'src', 'views'));
app.set('view engine', 'ejs');

app.use(routes);

app.listen(3000, () => 
    console.log('Acessar http://localhost:3000');
    console.log('Servidor executando na porta 3000');
);

我有这个错误,但我的数据库根本没有密码,我没有密码的事实可能会干扰连接?在某种程度上,password 接收 null 是因为没有值?我试图解决,看看 sasl.js 上有什么,但没有太大帮助

【问题讨论】:

【参考方案1】:

在您的 pg_hba.conf 文件中(在 Windows 上,目录是 \Program Files\PostgreSQL\13\data)更改 IPv4 和 IPv6 本地连接的方法来信任scram-sha-256 加密机制需要密码,这就是它失败的原因。

【讨论】:

使用trust 身份验证充其量只是一个临时解决方案,如果您真的信任传入的连接请求。为什么首先会出现此错误消息?这是因为密码错误还是未提供密码?如果我想重新使用 SCRAM-SHA-256 身份验证怎么办? IIRC 数据库本身没有密码设置,这可能是加密失败的原因。 @AnantaKRoy 对于 Postgres 13 的新安装,我遇到了这个身份验证失败问题。我不确定是否需要设置其他东西才能使 scram-sha 开箱即用。我一直在使用带有 md5 的 Postgres 12,没有任何问题。 您可以尝试为数据库设置密码,并使用加密机制查看是否有效。

以上是关于postgres 与 node.js 连接中的 SASL 错误的主要内容,如果未能解决你的问题,请参考以下文章

如何将 postgres 查询分配给 node.js、Discord bot 和 postgres 集成中的变量?

使用 Node.js 从 Redshift 将数据复制到 postgres

node.js + postgres 数据库事务管理

如何优化 Postgresql max_connections 和 node-postgres 连接池?

具有大量查询的 node-postgres

使用node.js将postgres库中的空间数据导出为geojson