Nodejs mysql.createConnection не принимает пароль - PullRequest
0 голосов
/ 12 марта 2019

У меня проблемы с подключением к базе данных MySQL в контейнере Docker с использованием NodeJs.

Состояния ошибки: "Error: Access denied for user 'username'@'172.19.0.3' (using password: NO)", но, насколько я вижу, я даю пароль.

Итак, мой вопрос: почему в сообщении об ошибке указано, что я не использую пароль, а пароль явно указан?

Часть моего кода:

  /* file: ./nodejs-server/database/database.js */ 
  const mysql = require('mysql2/promise');

  let db = await mysql
    .createConnection({ // Error: Access denied for user 'username'@'172.19.0.3' (using password: NO)
      host: env.DB_HOST,
      port: 3306,
      user: env.MYSQL_USER,
      password: env.MYSQL_PASSWORD,
      database: env.MYSQL_DATABASE,
      authSwitchHandler: (_, cb) => {
        // workaround for node mysql bug #1507
        cb(null, Buffer.alloc(0));
      },
    })
    .catch((err) => {
      throw new Error('Could not connect to the database');
    });

Я проверил значение env.MYSQL_PASSWORD и оно содержит правильный пароль.
Я не уверен, вызвана ли эта ошибка неправильным синтаксисом или настройкой моих контейнеров Docker.

# file: ./mysql-server/Dockerfile
FROM mysql:latest
VOLUME ["/etc/mysql", "/var/lib/mysql"]
EXPOSE 3306
# file: ./nodejs-server/Dockerfile
FROM node:10
WORKDIR /usr/src/app
COPY package*.json ./
RUN npm install
COPY . .
EXPOSE 8080
CMD [ "npm", "run", "watch" ]
# file: ./docker-composer.yml
version: "3.3"
services:
  nodejs:
    build: ./nodejs-server
    ports:
      - "8001:8080"
    links:
      - db:db
    env_file:
      - ./.env-example
    volumes:
      - ./nodejs-server:/usr/src/app
  db:
    build: ./mysql-server
    volumes:
      - ./mysql-server/data:/docker-entrypoint-initdb.d #A folder /mysql-server/data with a .sql file needs to exist
    env_file:
      - ./.env-example

Контейнеры nodejs и mysql работают, так как я могу войти в командную строку, а nodejs правильно сеет страницу «Hello world».
Кроме того, контейнеры Docker подключаются, потому что когда яостановите контейнер mysql, я получаю еще одну ошибку, сообщающую, что невозможно установить соединение.

У меня есть GRANT USAGE ON *.* TO `username`@`%` и GRANT ALL PRIVILEGES ON `databasename`.* TO `username`@`%`, поэтому разрешения, похоже, в порядке.

1 Ответ

0 голосов
/ 12 марта 2019

Решение состоит в том, чтобы разрешить пользователю подключаться с 172.19. * Поскольку IP-адрес док-контейнера может быть непредсказуемым, а разрешение пользователя MySql должно быть правильно установлено.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...