我正在关注这篇文章((http://nodeexamples.com/2012/09/21/connecting-to-a-postgresql-database-from-node-js-using-the-pg-module/)。我已经将我的应用程序部署到heroku并且目前正在使用express,node.js,尝试连接到我刚安装的Heroku中的PostgresSQL数据库。到文章的最后,我使用命令
node myfile.js
我收到此错误
error: no pg_hba.conf entry for host "...", user "...", database "...", ...
如何创建一个以及我应用程序目录中的哪个位置?
以下是整个错误消息。我更改了IP地址,用户和数据库的字符串,但它看起来基本上就像它。
events.js:72
throw er; // Unhandled 'error' event
^
error: no pg_hba.conf entry for host "00.000.000.00", user "username", database "databasename", SSL off
at Connection.parseE (/Users/user/workspace/MyApp/app/node_modules/pg/lib/connection.js:526:11)
at Connection.parseMessage (/Users/user/workspace/MyApp/app/node_modules/pg/lib/connection.js:356:17)
at Socket.<anonymous> (/Users/user/workspace/MyApp/app/node_modules/pg/lib/connection.js:105:22)
at Socket.emit (events.js:95:17)
at Socket.<anonymous> (_stream_readable.js:748:14)
at Socket.emit (events.js:92:17)
at emitReadable_ (_stream_readable.js:410:10)
at emitReadable (_stream_readable.js:406:5)
at readableAddChunk (_stream_readable.js:168:9)
at Socket.Readable.push (_stream_readable.js:130:10)
编辑:我做了更多研究,发现&#39; pg_hba.conf&#39;文件在我的
/usr/local/var/postgres
我将这一行添加到&#39; pg_hba.conf&#39;文件
# TYPE DATABASE USER ADDRESS METHOD
host all all trust
也尝试了
# TYPE DATABASE USER ADDRESS METHOD
host all all 0.0.0.0/0 md5
但它一直说我的主机,用户,数据库等没有条目...... 是我的&#39; pg_hba.conf&#39;语法有什么错误吗?
答案 0 :(得分:30)
更改连接代码以使用ssl。关注您的链接示例:
var conString = "pg://admin:guest@localhost:5432/Employees";
var client = new pg.Client(conString);
client.connect();
变为:
var client = new pg.Client({
user: "admin",
password: "guest",
database: "Employees",
port: 5432,
host: "localhost",
ssl: true
});
client.connect();
https://github.com/brianc/node-postgres/wiki/Client#new-clientobject-config--client
答案 1 :(得分:12)
如果sequelize忽略了你打开ssl的所有努力,你可以尝试说服pg默认为所有conncetions启用ssl:
var pg = require('pg');
pg.defaults.ssl = true;
const Sequelize = require('sequelize');
const sequelize = new Sequelize('postgres://...');
答案 2 :(得分:10)
添加?ssl=true
应该可以在uri的末尾工作。
var conString = "pg://admin:guest@localhost:5432/Employees?ssl=true";
答案 3 :(得分:6)
我们在将heroku上的pg数据库从hobby
层升级到standard-0
时遇到了此错误。 SSL是必需的,但是我们没有在配置中设置它。
初始化新的Sequelize(...)时包含在配置中
"dialect": "postgres",
"dialectOptions": {
"ssl": true
}
这个技巧是,ssl选项包装在dialectOptions
中。
在此处找到:https://github.com/sequelize/sequelize/issues/956#issuecomment-147745033
答案 4 :(得分:6)
DialectOptions with SSL 有效,但您也可以更新配置变量 PGSSLMODE。
<块引用>或者,您可以省略 ssl 配置对象,如果您 指定 PGSSLMODE 配置变量:heroku config:set PGSSLMODE=no-verify。
Heroku 在他们的变更日志 here
中宣布了这一 SSL 变更答案 5 :(得分:5)
您也可以通过Heroku的网络界面或CLI使用ENVIRONMENT CONFIG VARIABLE'PGSSLMODE'来“要求”。
案例:Postgres dB设置为Heroku附加组件并附加到Heroku Dyno上的应用程序。
Heroku为如何连接到其附加数据库提供了一些非常好的支持;然而,遗憾的是,它遗漏了(或者,我错过了)任何关于强制执行SSL的提及,因为默认情况下以Standard-0开头的所有Heroku dB层强制执行SSL。
答案 6 :(得分:3)
const sequelize = new Sequelize({
database: "DB",
username: "root",
password: "pass",
host: "localhost",
port: 5432,
dialect: "postgres",
dialectOptions: {
ssl: {
require: true, // This will help you. But you will see nwe error
rejectUnauthorized: false // This line will fix new error
}
},
});
答案 7 :(得分:2)
我一次又一次地遇到同样的问题。 包:
"pg": "^8.5.1",
"pg-hstore": "^2.3.3",
"sequelize": "^6.5.0",
"sequelize-cli": "^6.2.0"
我通过在 Sequelize 的 config.json 文件中添加以下内容解决了这个问题。
"dialect": "postgres",
"dialectOptions": {
"ssl": {
"rejectUnauthorized": false
}
}
答案 8 :(得分:1)
对我有用的是上述答案和评论(来自@schybo)的组合
let cloud_config = {
username: process.env.DB_USERNAME,
database: process.env.DB_DATABASE,
password: process.env.DB_PASSWORD,
host: process.env.DB_HOSTNAME,
port: 5432,
ssl: true,
dialect: 'postgres',
dialectOptions: {
"ssl": {"require":true }
}
};
同时使用ssl: true,
和dialectOptions: { "ssl": {"require":true }}
Comment关于续集的问题,该问题也已添加到文档中。
答案 9 :(得分:0)
只需在客户端初始化中添加一个标志:
更改
const conString = "pg://admin:guest@localhost:5432/Employees"
const client = new pg.Client(conString);
client.connect();
收件人
const conString = "pg://admin:guest@localhost:5432/Employees"
const client = new pg.Client({
connectionString: process.env.DATABASE_URL,
ssl: true
});
client.connect();
答案 10 :(得分:0)
设置ssl: true
对我有用
let pg = require('pg');
let pgClient = new pg.Client({
user: "admin",
password: "guest",
database: "Employees",
port: 5432,
host: "localhost",
ssl: true
});
pgClient.connect();
答案 11 :(得分:0)
您必须添加
ssl: true
在json连接中
{
host: 'myHost.com',
user: 'myUser',
password: 'myPassword',
database: 'myDb',
port: 5432,
ssl: true
}
答案 12 :(得分:0)
const Pool = require("pg").Pool;
const proConfig = {
connectionString: process.env.DATABASE_URL,
ssl: {
rejectUnauthorized: false
}
}
const pool = new Pool(proConfig);
module.exports = pool;
答案 13 :(得分:0)
只需通过允许和要求 SSL 更新您的 database/config.js 文件
production: {
use_env_variable: 'DATABASE_URL',
dialect: 'postgresql',
ssl: true,
dialectOptions: {
ssl: { require: true },
},
logging: false,
},
之后可能会遇到另一个问题:nodejs - error self-signed certificate in
如果是这种情况,请在运行 node 或直接使用 NODE_TLS_REJECT_UNAUTHORIZED='0'
node app.js
NODE_TLS_REJECT_UNAUTHORIZED='0'
作为环境变量
答案 14 :(得分:0)
在创建 pg 客户端时,这个配置为我解决了这个问题。您还可以在此处阅读模块网站上的详细文档 >>> https://node-postgres.com/features/ssl。谢谢。
new pg.client({
connectionString,
ssl: {
rejectUnauthorized: false,
},
})