使用 Node JS 连接到在线托管的 PostgresQL
Connecting to PostgresSQL hosted online using NodeJS
我目前正在尝试从数据库创建一个功能查询,以 post 将其放入创建的 csv 文件中,但是我无法以编程方式连接到 PSQL 主机。所以我想做的是:-
- 连接到数据库并查询结果
- 将结果推送到 Excel 文件
- 继续()
- SFTP 在 SFTP 服务器上向我自己发送结果并将文件放在目录中。
我可以通过 CLI 中的以下命令手动连接到 PostgresDB:-
- ssh username@xx.xx.xx.xx //不需要密码因为我的id_rsa密钥存储在服务器
- psql -U username -h LOCALHOST -p 5432 -d databasename pass- password (手动输入)
此外,通过 Visual Studio 代码连接也能正常工作,但是我需要连接到服务器(远程连接),然后使用 postgres 驱动程序连接到数据库。
经过调查,我想我首先需要使用 SSH 连接到服务器,然后才允许我访问数据库。
这就是我通过代码实现它的方式:-
Index.js
const serverConnectionParams = require('./src/config/serverConn');
function testConnectionServer() {
try {
serverConnectionParams.connectToServer();
} catch (err) {
console.error(err);
}
}
testConnectionServer();
serverConn.js
const { Client } = require('ssh2');
const { readFileSync } = require('fs');
const databaseConnectionParams = require('./databaseConn');
function connectToServer() {
const conn = new Client();
conn.on('ready', () => {
console.log('Client :: ready');
conn.exec('uptime', (err, stream) => {
if (err) throw err;
databaseConnectionParams.auth(); *// This is the database connection param*
stream.on('data', (data) => {
console.log('STDOUT: ' + data);
}).stderr.on('data', (data) => {
console.log('STDERR: ' + data);
});
});
}).connect({
host: 'xx.xx.xx.xx',
username: 'username',
privateKey: readFileSync('src/key/id_rsa')
});
}
exports.connectToServer = connectToServer;
databaseConn.js
const { readFileSync } = require('fs');
const envParam = require('./env.js');
const { Sequelize } = require('sequelize');
const sequelize = new Sequelize(envParam.database, envParam.username, envParam.password, {
host: envParam.host,
dialect: envParam.dialect,
ssl: true,
pool: {
max: envParam.pool.max,
min: envParam.pool.min,
acquire: envParam.pool.aquire,
idle: envParam.pool.idle
}
});
async function auth() {
try {
console.log('trying to connect')
sequelize.validate();
} catch (error) {
console.error('Unable to connect to the database:', error);
}
}
exports.auth = auth;
env.js
const env = {
database: 'databasename',
username: 'username',
password: 'password',
host: 'ip@',
dialect: 'postgres',
pool: {
max: 5,
min: 0,
aquire: 30000,
idle: 10000
}
};
module.exports = env;
在 运行 我的节点 index.js 之后,我收到以下错误语句:-
Client :: ready
trying to connect
STDOUT: 10:43:09 up 1:21, 1 user, load average: 5.71, 6.03, 5.15
C:\Users\~\node_modules\sequelize\lib\dialects\postgres\connection-manager.js:184
reject(new sequelizeErrors.ConnectionError(err));
^
ConnectionError [SequelizeConnectionError]: no pg_hba.conf entry for host "xx.xx.xx.xx", user "username", database "databasename", SSL off
at Client._connectionCallback
{
parent: error: no pg_hba.conf entry for host "xx.xx.xx.xx", user "username", database "databasename", SSL off
at Parser.parseErrorMessage
{
length: 154,
severity: 'FATAL',
code: '28000',
detail: undefined,
hint: undefined,
position: undefined,
internalPosition: undefined,
internalQuery: undefined,
where: undefined,
schema: undefined,
table: undefined,
column: undefined,
dataType: undefined,
constraint: undefined,
file: 'auth.c',
line: '490',
routine: 'ClientAuthentication'
},
original: error: no pg_hba.conf entry for host "x.x.x.x", user "username", database "password", SSL off
at Parser.parseErrorMessage (C:\Users\~\node_modules\pg-protocol\dist\parser.js:287:98)
at Parser.handlePacket (C:\Users\~\node_modules\pg-protocol\dist\parser.js:126:29)
at Parser.parse (C:\Users\~\node_modules\pg-protocol\dist\parser.js:39:38)
at Socket.<anonymous> (C:\Users\~\node_modules\pg-protocol\dist\index.js:11:42)
at Socket.emit (node:events:394:28)
at addChunk (node:internal/streams/readable:315:12)
at readableAddChunk (node:internal/streams/readable:289:9)
at Socket.Readable.push (node:internal/streams/readable:228:10)
at TCP.onStreamRead (node:internal/stream_base_commons:199:23) {
length: 154,
severity: 'FATAL',
code: '28000',
detail: undefined,
hint: undefined,
position: undefined,
internalPosition: undefined,
internalQuery: undefined,
where: undefined,
schema: undefined,
table: undefined,
column: undefined,
dataType: undefined,
constraint: undefined,
file: 'auth.c',
line: '490',
routine: 'ClientAuthentication'
}
}
正在调查错误代码:28000
找到这个 link 将问题解释为身份验证尝试失败
https://help.heroku.com/DR0TTWWD/seeing-fatal-no-pg_hba-conf-entry-errors-in-postgres
也在网上找到了几个关于pg_hba.conf需要使用md5然后重启postgress的解决方案(没试过,因为我无法重启postgress服务)
找到另一个解释它是 SSL 问题的解决方案(试过但没有用)
Node.js, PostgreSQL error: no pg_hba.conf entry for host
使用 SSL 后,它会将错误代码更改为以下内容:-
SequelizeConnectionError: self signed certificate
在这里找到了解决方案:-
在我输入之后它会给我一个不同的错误,即 rejectUnauthorized 已贬值且版本非常旧(目前似乎无法重现错误代码)
所以我现在束手无策,任何帮助都会很棒!
我也尝试过使用不同的 Javascript 模块而不是 sequelize,但是它们都有相同的身份验证问题。
我也尝试传递我的 id_rsa 密钥,但是它根本无法解决我的问题。
我的假设是,即使我在 SSH 连接中传递了 connToDatabase 函数,它仍在错误的位置搜索 ip@。 (服务器DB的IP@为192.168.31.4)
但是当使用那个 IP@ 时它会说 ERR 连接超时
我的另一个假设是数据库有很多连接限制,需要更多参数。
更新:
我尝试在 VSC 上通过远程访问编辑 pg_hba.conf 文件,但是它会给我错误无法读取文件。
任何帮助都会很棒!
我完全忘记了我 post 编辑了这个问题。
它的解决方案非常简单,在调查了一段时间后我意识到我在连接参数方面犯了错误。
对于需要此类问题帮助的其他人,我将post以简单的方式提供解决方案。
基本上,我首先需要通过 SSH 连接到服务器,然后在我的连接中添加一个隧道以连接到数据库。然后,只有到那时,我的数据库 sequelize 参数才会通过,因为我已经完全连接到服务器和内部 postgresql 数据库。
所以 TLDR
SSH -> 隧道 -> 续集
ssh(10.x.x.1, 等等) -> addTunnel(localhost, 等等) -> sequelize(数据库名称, 等等)
我目前正在尝试从数据库创建一个功能查询,以 post 将其放入创建的 csv 文件中,但是我无法以编程方式连接到 PSQL 主机。所以我想做的是:-
- 连接到数据库并查询结果
- 将结果推送到 Excel 文件
- 继续()
- SFTP 在 SFTP 服务器上向我自己发送结果并将文件放在目录中。
我可以通过 CLI 中的以下命令手动连接到 PostgresDB:-
- ssh username@xx.xx.xx.xx //不需要密码因为我的id_rsa密钥存储在服务器
- psql -U username -h LOCALHOST -p 5432 -d databasename pass- password (手动输入)
此外,通过 Visual Studio 代码连接也能正常工作,但是我需要连接到服务器(远程连接),然后使用 postgres 驱动程序连接到数据库。
经过调查,我想我首先需要使用 SSH 连接到服务器,然后才允许我访问数据库。
这就是我通过代码实现它的方式:-
Index.js
const serverConnectionParams = require('./src/config/serverConn');
function testConnectionServer() {
try {
serverConnectionParams.connectToServer();
} catch (err) {
console.error(err);
}
}
testConnectionServer();
serverConn.js
const { Client } = require('ssh2');
const { readFileSync } = require('fs');
const databaseConnectionParams = require('./databaseConn');
function connectToServer() {
const conn = new Client();
conn.on('ready', () => {
console.log('Client :: ready');
conn.exec('uptime', (err, stream) => {
if (err) throw err;
databaseConnectionParams.auth(); *// This is the database connection param*
stream.on('data', (data) => {
console.log('STDOUT: ' + data);
}).stderr.on('data', (data) => {
console.log('STDERR: ' + data);
});
});
}).connect({
host: 'xx.xx.xx.xx',
username: 'username',
privateKey: readFileSync('src/key/id_rsa')
});
}
exports.connectToServer = connectToServer;
databaseConn.js
const { readFileSync } = require('fs');
const envParam = require('./env.js');
const { Sequelize } = require('sequelize');
const sequelize = new Sequelize(envParam.database, envParam.username, envParam.password, {
host: envParam.host,
dialect: envParam.dialect,
ssl: true,
pool: {
max: envParam.pool.max,
min: envParam.pool.min,
acquire: envParam.pool.aquire,
idle: envParam.pool.idle
}
});
async function auth() {
try {
console.log('trying to connect')
sequelize.validate();
} catch (error) {
console.error('Unable to connect to the database:', error);
}
}
exports.auth = auth;
env.js
const env = {
database: 'databasename',
username: 'username',
password: 'password',
host: 'ip@',
dialect: 'postgres',
pool: {
max: 5,
min: 0,
aquire: 30000,
idle: 10000
}
};
module.exports = env;
在 运行 我的节点 index.js 之后,我收到以下错误语句:-
Client :: ready
trying to connect
STDOUT: 10:43:09 up 1:21, 1 user, load average: 5.71, 6.03, 5.15
C:\Users\~\node_modules\sequelize\lib\dialects\postgres\connection-manager.js:184
reject(new sequelizeErrors.ConnectionError(err));
^
ConnectionError [SequelizeConnectionError]: no pg_hba.conf entry for host "xx.xx.xx.xx", user "username", database "databasename", SSL off
at Client._connectionCallback
{
parent: error: no pg_hba.conf entry for host "xx.xx.xx.xx", user "username", database "databasename", SSL off
at Parser.parseErrorMessage
{
length: 154,
severity: 'FATAL',
code: '28000',
detail: undefined,
hint: undefined,
position: undefined,
internalPosition: undefined,
internalQuery: undefined,
where: undefined,
schema: undefined,
table: undefined,
column: undefined,
dataType: undefined,
constraint: undefined,
file: 'auth.c',
line: '490',
routine: 'ClientAuthentication'
},
original: error: no pg_hba.conf entry for host "x.x.x.x", user "username", database "password", SSL off
at Parser.parseErrorMessage (C:\Users\~\node_modules\pg-protocol\dist\parser.js:287:98)
at Parser.handlePacket (C:\Users\~\node_modules\pg-protocol\dist\parser.js:126:29)
at Parser.parse (C:\Users\~\node_modules\pg-protocol\dist\parser.js:39:38)
at Socket.<anonymous> (C:\Users\~\node_modules\pg-protocol\dist\index.js:11:42)
at Socket.emit (node:events:394:28)
at addChunk (node:internal/streams/readable:315:12)
at readableAddChunk (node:internal/streams/readable:289:9)
at Socket.Readable.push (node:internal/streams/readable:228:10)
at TCP.onStreamRead (node:internal/stream_base_commons:199:23) {
length: 154,
severity: 'FATAL',
code: '28000',
detail: undefined,
hint: undefined,
position: undefined,
internalPosition: undefined,
internalQuery: undefined,
where: undefined,
schema: undefined,
table: undefined,
column: undefined,
dataType: undefined,
constraint: undefined,
file: 'auth.c',
line: '490',
routine: 'ClientAuthentication'
}
}
正在调查错误代码:28000
找到这个 link 将问题解释为身份验证尝试失败
https://help.heroku.com/DR0TTWWD/seeing-fatal-no-pg_hba-conf-entry-errors-in-postgres
也在网上找到了几个关于pg_hba.conf需要使用md5然后重启postgress的解决方案(没试过,因为我无法重启postgress服务)
找到另一个解释它是 SSL 问题的解决方案(试过但没有用)
Node.js, PostgreSQL error: no pg_hba.conf entry for host
使用 SSL 后,它会将错误代码更改为以下内容:-
SequelizeConnectionError: self signed certificate
在这里找到了解决方案:-
在我输入之后它会给我一个不同的错误,即 rejectUnauthorized 已贬值且版本非常旧(目前似乎无法重现错误代码)
所以我现在束手无策,任何帮助都会很棒!
我也尝试过使用不同的 Javascript 模块而不是 sequelize,但是它们都有相同的身份验证问题。
我也尝试传递我的 id_rsa 密钥,但是它根本无法解决我的问题。
我的假设是,即使我在 SSH 连接中传递了 connToDatabase 函数,它仍在错误的位置搜索 ip@。 (服务器DB的IP@为192.168.31.4)
但是当使用那个 IP@ 时它会说 ERR 连接超时
我的另一个假设是数据库有很多连接限制,需要更多参数。
更新:
我尝试在 VSC 上通过远程访问编辑 pg_hba.conf 文件,但是它会给我错误无法读取文件。
任何帮助都会很棒!
我完全忘记了我 post 编辑了这个问题。
它的解决方案非常简单,在调查了一段时间后我意识到我在连接参数方面犯了错误。
对于需要此类问题帮助的其他人,我将post以简单的方式提供解决方案。
基本上,我首先需要通过 SSH 连接到服务器,然后在我的连接中添加一个隧道以连接到数据库。然后,只有到那时,我的数据库 sequelize 参数才会通过,因为我已经完全连接到服务器和内部 postgresql 数据库。
所以 TLDR SSH -> 隧道 -> 续集
ssh(10.x.x.1, 等等) -> addTunnel(localhost, 等等) -> sequelize(数据库名称, 等等)