You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Windows 10环境下JavaScript项目连接PostgreSQL时的客户端密码配置问题求助

解决PostgreSQL连接时的"SASL: SCRAM-SERVER-FIRST-MESSAGE: client password must be a string"错误

刚碰到过类似的问题,我来帮你搞定这个密码相关的连接错误!

为啥会出这个错?

这个错误的核心原因很明确:你的pg.Pool配置里要么没加密码参数,要么密码不是字符串类型(比如不小心传了数字、undefined这种非字符串值)。PostgreSQL 10及以后的版本默认用SCRAM认证机制,严格要求客户端必须传字符串格式的密码,不然就会报这个错。

一步步解决问题

1. 先确认你的数据库用户密码

首先得搞清楚你要连接的PostgreSQL用户的密码:

  • 如果用的是默认的postgres用户,回忆下安装PostgreSQL时设置的密码;
  • 如果是自己创建的自定义用户,确认好该用户的密码。

2. 修改Pool配置,补上字符串格式的密码

直接在你的Pool配置对象里加上password字段,注意值必须是字符串(哪怕是纯数字密码也要用引号包起来),另外别忘了加上user字段(默认是postgres):

const Pool = pg.Pool;
const pool = new Pool({
  database: 'proth',
  host: 'localhost',
  port: 5432, // 这里写成数字更规范,pg库能自动识别
  user: 'postgres', // 必须指定数据库用户名
  password: '你的数据库密码', // 这里一定要是字符串,比如'123456'
  max: 10,
  idleTimeoutMillis: 30000,
});

3. 更安全的写法:用环境变量存密码

别把密码硬写在代码里,太不安全了!推荐用环境变量来管理敏感信息:

  • 先在项目根目录建个.env文件(记得把这个文件加到.gitignore里,绝对不能提交到代码仓库):
PG_USER=postgres
PG_PASSWORD=你的数据库密码
PG_DATABASE=proth
PG_HOST=localhost
PG_PORT=5432
  • 安装dotenv库来加载环境变量:执行npm install dotenv
  • 修改代码加载环境变量:
require('dotenv').config(); // 先加载环境变量
const Pool = pg.Pool;
const pool = new Pool({
  database: process.env.PG_DATABASE,
  host: process.env.PG_HOST,
  port: process.env.PG_PORT,
  user: process.env.PG_USER,
  password: process.env.PG_PASSWORD, // 从环境变量拿,自动是字符串类型
  max: 10,
  idleTimeoutMillis: 30000,
});

额外要注意的点

  • 如果你的数据库用户没设置密码,也会出这个错,这时候得给用户设置密码:打开PostgreSQL的命令行工具,执行ALTER USER postgres WITH PASSWORD '你想设的密码';(替换成你的用户名和密码)。
  • 关于port字段:你之前写的是字符串'5432',pg库其实能自动转换,但写成数字5432更规范。

内容的提问来源于stack exchange,提问作者XGalilei

火山引擎 最新活动