【问题标题】:NodeJS and Mysql connection configuration ignoredNodeJS 和 Mysql 连接配置被忽略
【发布时间】:2021-01-01 17:00:23
【问题描述】:

当我尝试从 nodeJS API 查询我的 MySQL 数据库时,我有一个奇怪的行为。 我使用以下代码在节点上定义了一个到 mysql 的连接池

const mysql = require('mysql2')

const pool = mysql.createPool({
  host: process.env.DB_HOST,
  user: 'mydb.user', 
  database: process.env.DB_DB,
  password: process.env.DB_PWD,
  waitForConnections: true,
  connectionLimit: 10,
  queueLimit: 0,
  multipleStatements: true
}).promise()

在此之前,我使用的是在 .env 文件中定义的另一个名为 mydb.owner 的用户。

当我执行查询时,出现以下错误

Access denied for user 'mydb.owner'@'localhost' to database 'mydb'

那不是我配置的用户,那是旧的。

如果我查看 Mysql 连接,我可以看到池的用户是正确的:

show processlist;

返回

Id   User         Host               db
6    root         localhost:37752    mydb
9    mydb.user    localhost:38102    mydb

似乎我没有从其他地方定义任何环境变量:

echo $DB_USER

什么都不返回。

用户似乎拥有必要的权限:

SHOW GRANTS FOR 'mydb.user'@'localhost';
GRANT USAGE ON *.* TO 'mydb.user'@'localhost'
GRANT SELECT, INSERT, UPDATE, DELETE, EXECUTE ON `mydb`.* TO 'mydb.user'@'localhost' WITH GRANT OPTION

我不明白为什么 mysql2 会返回一个关于我的旧用户 mydb.owner 的错误。

【问题讨论】:

    标签: javascript mysql node.js


    【解决方案1】:

    查询是一个存储过程,默认使用标签创建

    CREATE definer = 'mydb.owner'@'localhost' PROCEDURE ...
    

    无论哪个用户执行存储过程,都被冒充mydb.owner帐户。

    为了指定程序必须在当前账户下执行,我添加了以下说明:

    CREATE definer = 'mydb.owner'@'localhost' PROCEDURE ...()
    SQL SECURITY INVOKER
    BEGIN ...
    

    【讨论】:

      猜你喜欢
      • 2017-11-30
      • 2013-04-06
      • 2016-09-13
      • 1970-01-01
      • 2020-08-25
      • 1970-01-01
      • 2019-02-22
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多