首页 > 解决方案 > NodeJS 和 Mysql 连接配置被忽略

问题描述

当我尝试从 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()

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

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

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

标签: javascriptmysqlnode.js

解决方案


该查询是一个存储过程,默认情况下使用标记创建

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

无论哪个用户执行存储过程,它都被模拟为mydb.owner帐户。

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

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

推荐阅读