我的 Node.js 应用程序能够通过 npm pg
模块使用本地 Postgres 数据库。我也可以使用 heroku pg:psql
命令通过命令行连接到 Heroku 托管的 Postgres 数据库(免费的 Hobby Dev 计划)。 但是, 当我的 Node.js 应用程序尝试查询 Heroku 托管的 Postgres 数据库时,我收到了 self signed certificate
错误。
这是带有 self signed certificate
错误的输出:
(node:2100) UnhandledPromiseRejectionWarning: Error: self signed certificate
at TLSSocket.onConnectSecure (_tls_wrap.js:1051:34)
at TLSSocket.emit (events.js:189:13)
at TLSSocket._finishInit (_tls_wrap.js:633:8)
(node:2100) UnhandledPromiseRejectionWarning: Unhandled promise rejection. This error originated either by throwing inside of an async function without a catch block, or by rejecting a promise which was not handled with .catch(). (rejection id: 1)
(node:2100) [DEP0018] DeprecationWarning: Unhandled promise rejections are deprecated. In the future, promise rejections that are not handled will terminate the Node.js process with a non-zero exit code.
D:\MY\DEV\PROJECTS\AdsSubscribeBot\test.js:57
if (err) throw err;
^
Error: Connection terminated unexpectedly
at Connection.con.once (D:\MY\DEV\PROJECTS\AdsSubscribeBot\node_modules\pg\lib\client.js:264:9)
at Object.onceWrapper (events.js:277:13)
at Connection.emit (events.js:189:13)
at Socket.<anonymous> (D:\MY\DEV\PROJECTS\AdsSubscribeBot\node_modules\pg\lib\connection.js:76:10)
at Socket.emit (events.js:194:15)
at TCP._handle.close (net.js:597:12)
重现此错误的最简单方法是尝试使用示例代码从 Heroku devcenter 连接到 Node.js: https://devcenter.heroku.com/articles/heroku-postgresql#connecting-in-node-js
以下是导致 self signed certificate
错误的代码示例:
const connectionString = 'postgres://USERNAME:PASSWORD@HOST:PORT/DB_NAME';
const { Client } = require('pg');
const client = new Client({
connectionString: connectionString,
ssl: true
});
client.connect();
client.query('SELECT * FROM users;', (err, res) => {
if (err) throw err;
for (let row of res.rows) {
console.log(JSON.stringify(row));
}
client.end();
});
也许有人遇到过同样的问题并且知道如何解决它。
在此先感谢您的帮助。
原文由 akzhar 发布,翻译遵循 CC BY-SA 4.0 许可协议
检查你的 pg 配置。听起来您正在使用 pg 8,它不赞成隐式禁用证书验证(就像您在配置中将 ssl 设置为 true 但未提供 ssl 配置一样)。指定
rejectUnauthorized: true
需要有效的 CA 或rejectUnauthorized: false
明确选择退出 MITM 保护。您可以在如下设置 pg 配置的地方执行此操作