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




