【问题标题】:Nodejs mysql.createConnection not accepting passwordNodejs mysql.createConnection 不接受密码
【发布时间】:2019-08-02 15:47:38
【问题描述】:

我在使用 NodeJs 连接到 Docker 容器中的 MySQL 数据库时遇到问题。

错误状态:"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`@`%` 所以权限似乎没问题。

【问题讨论】:

    标签: mysql node.js docker


    【解决方案1】:

    解决方案是允许用户从 172.19.* 连接,因为 docker 容器 IP 可能无法预测,并且必须正确设置 MySql 用户权限。

    【讨论】:

    • 我有GRANT USAGE ON *.* TO `username`@`%` GRANT ALL PRIVILEGES ON `databasename`.* TO `username`@`%` ,所以我希望它可以工作。另外,为什么错误消息状态为:"using password: NO"?
    猜你喜欢
    • 2019-06-10
    • 2017-03-31
    • 1970-01-01
    • 2018-02-20
    • 1970-01-01
    • 2020-09-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多