Node.js nodejs停靠应用程序可以';无法连接到已停靠的数据库

Node.js nodejs停靠应用程序可以';无法连接到已停靠的数据库,node.js,docker,docker-compose,mariadb,Node.js,Docker,Docker Compose,Mariadb,我的设置是: 通过docker compose启动带有dockerfile的Mariadb容器 通过docker compose启动dockerfile的NodeJs容器 我的问题: 我无法将我的nodejs应用程序连接到数据库。我可以通过dbeaver或命令行本地访问数据库,因此我知道它正在工作。但是,当我试图通过我的index.js访问它时,我得到以下错误: Error: connect ECONNREFUSED 127.0.0.1:3306 at TCPConnectWrap.afte

我的设置是:

  • 通过docker compose启动带有dockerfile的Mariadb容器
  • 通过docker compose启动dockerfile的NodeJs容器
我的问题:

我无法将我的nodejs应用程序连接到数据库。我可以通过dbeaver或命令行本地访问数据库,因此我知道它正在工作。但是,当我试图通过我的index.js访问它时,我得到以下错误:

Error: connect ECONNREFUSED 127.0.0.1:3306
at TCPConnectWrap.afterConnect [as oncomplete] (net.js:1141:16)
From event:
at _registerHandshakeCmd (/usr/src/app/node_modules/mariadb/lib/connection.js:689:11)
at /usr/src/app/node_modules/mariadb/lib/connection.js:57:11
at new Promise (<anonymous>)
at Connection.connect (/usr/src/app/node_modules/mariadb/lib/connection.js:56:16)
at Object.createConnection (/usr/src/app/node_modules/mariadb/promise.js:17:36)
at Object.<anonymous> (/usr/src/app/src/index.js:24:28)
at Module._compile (internal/modules/cjs/loader.js:1147:30)
at Object.Module._extensions..js (internal/modules/cjs/loader.js:1167:10)
at Module.load (internal/modules/cjs/loader.js:996:32)
at Function.Module._load (internal/modules/cjs/loader.js:896:14) {
    errno: -111,
    code: 'ECONNREFUSED',
    syscall: 'connect',
    address: '127.0.0.1',
    port: 3306,
    fatal: true
}
Mariadb Dockerfile:

FROM mariadb:latest
ENV MYSQL_ROOT_PASSWORD=mdp
ENV MYSQL_DATABASE=dashboard
ENV MYSQL_USER=monty
ENV MYSQL_PASSWORD=monty
USER 1000
EXPOSE 3306
docker-compose.yml:

version: '3'
services: 
    web:
        build: ./backend
        ports:
            - "8080:8080"
        volumes:
            - ./backend:/usr/src/app/
        working_dir: /usr/src/app
        environment:
            - MARIADB_HOST=database
            - MARIADB_PORT_NUMBER=3306
            - MARIADB_USER=monty
            - MARIADB_PASSWORD=monty
            - MARIADB_DATABASE=dashboard
        user: "1000"
        container_name: backend
        depends_on:
            - database
        links:
            - database:database
    database:
        build: ./database
        ports:
            - "3306:3306"
        expose:
            - "3306"
        volumes:
            - /database/data:/var/lib/mysql:rw
        user: "1000"
        hostname: "localhost"
        environment:
            - ALLOW_EMPTY_PASSWORD=yes
            - MARIADB_DATABASE=dashboard
            - MARIADB_PORT=3306
            - MARIADB_USER=monty
            - MARIADB_PASSWORD=monty
        container_name: database
这是我的index.js:

const express = require('express')
const mariadb = require('mariadb');
const cors = require('cors');
const bodyParser = require('body-parser');
const app = express();
app.use(
    bodyParser.urlencoded({
        extended: true
    })
)
app.use(cors());

app.get('/', (req, res) => {
    res.send('hello world');
});

const connection = mariadb.createConnection({
    host: '127.0.0.1',
    user: 'someuser',
    password: 'somepassword',
    database: 'dashboard',
    port: '3306',
}).then(conn => {
    console.log('connection established.');
}).catch(err => {
    console.log(err);
});

app.listen(8080);

如果有人有任何关于在哪里查找或错误可能来自哪里的提示,我将不胜感激。谢谢

您正在NodeJS应用程序中使用
127.0.0.1
作为db主机名。但这是NodeJS容器的IP地址。每个容器都有自己的IP地址(例外:使用docker network
主机
)。这会导致以下错误:

错误:连接EConrefuse127.0.0.1:3306

使用
docker-compose
时,您可以使用在docker-compose.yml文件中指定的服务名称访问数据库。在您的示例中,服务名
数据库
可以用作主机名。试试这个:

const connection = mariadb.createConnection({
    host: 'database',
    ...

您正在NodeJS应用程序中使用
127.0.0.1
作为db主机名。但这是NodeJS容器的IP地址。每个容器都有自己的IP地址(例外:使用docker network
主机
)。这会导致以下错误:

错误:连接EConrefuse127.0.0.1:3306

使用
docker-compose
时,您可以使用在docker-compose.yml文件中指定的服务名称访问数据库。在您的示例中,服务名
数据库
可以用作主机名。试试这个:

const connection = mariadb.createConnection({
    host: 'database',
    ...

您在应用程序中硬编码了数据库地址;它不尊重环境变量设置。您在应用程序中硬编码了数据库地址;它不尊重环境变量设置。