我无法通过node.js连接到我的Postgresql数据库 这样运行dockerized postgresql服务器(https://docs.docker.com/engine/examples/postgresql_service/)。可以与pgadmin连接,但不能与节点连接。在此端口上没有看到任何进程。我看到什么错误:
MacBook-Pro-Maxim:nodejs lucio$ docker logs 5cc44d01bf4ada729e5f1c71157e4eba5cb6fa9fd40122f384b423fbd1ae13a7
2019-12-28T12:38:53: PM2 log: Launching in no daemon mode
2019-12-28T12:38:53: PM2 log: App [index:0] starting in -fork mode-
2019-12-28T12:38:53: PM2 log: App [index:0] online
{ Error: connect ECONNREFUSED 127.0.0.1:32775
at TCPConnectWrap.afterConnect [as oncomplete] (net.js:1107:14)
errno: 'ECONNREFUSED',
code: 'ECONNREFUSED',
syscall: 'connect',
address: '127.0.0.1',
port: 32775 }
database.js 这是我的数据库类的简单示例。只是用于连接和简化查询请求方法的参数构造器。
const {
Pool,
Client
} = require('pg')
const sqlQueryGenerator = require('sql-query-generator')
const sqlGenerator = require('sql')
sqlGenerator.setDialect('postgres')
sqlQueryGenerator.use('postgres')
class DataBase {
constructor(params) {
this.base = new Pool(params)
}
query(text) {
return new Promise((resolve, reject) => {
this.base.query(text, (err, res) => {
if (err) reject(err)
resolve(res)
})
})
}
}
module.exports = DataBase
在我的api.js文件中使用此模块
require('dotenv').config({ path: './.env' })
const DataBase = require('./database')
const db = new DataBase({
user : process.env.USER,
host : process.env.HOST,
database : process.env.TABLE,
password : process.env.PASSWORD,
port : process.env.PORT,
})
这是我的.env文件
HOST = localhost
USER = docker
TABLE = docker
PASSWORD = docker
PORT = 32775
在使用node.js api运行容器之前,请检查我的PostgreSQL docker容器的实际端口。 如何解决我的问题?感谢反馈
答案 0 :(得分:1)
您无法使用localhost
连接到数据库容器,这里的localhost
表示Nodejs容器而不是数据库容器。
{ Error: connect ECONNREFUSED 127.0.0.1:32775
在nodejs容器中寻找数据库的连接。
要与数据库容器连接,您有两个选择。
HOST = db_container_name
USER = docker
TABLE = docker
PASSWORD = docker
PORT = 5432
HOST = HOST_IP
USER = docker
TABLE = docker
PASSWORD = docker
PORT = 32775
或者更好地使用docker-compose为您处理网络,您可以使用容器名称引用任何容器进行连接。
答案 1 :(得分:0)
在.env文件中使用您的主机IP:
HOST = x.x.x.x
答案 2 :(得分:0)
您的node js应用程序正在使用docker运行吗? 如果是这种情况,则必须将两个容器放在同一网络上(最简单的解决方案),可以使用docker compose来做到这一点,后者会自动将所有容器放入同一网络,然后您可以通过其名称联系另一个容器。 或者,您可以使用以下命令检查数据库容器:
docker container inspect DB_CONTAINER
找到NetworksSettings-> Networks->在这里您将找到网络名称
然后,您可以将Node js容器连接到同一网络
docker network connect NETWORK_NAME NODE_CONTAINER_NAME
现在,您应该能够通过数据库容器主机名将节点容器连接到数据库(默认情况下是容器的ID,但是您可以在docker run命令执行期间使用--hostname参数指定主机名)>
希望这对您有帮助!