javascript - 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
。
解决方案
该查询是一个存储过程,默认情况下使用标记创建
CREATE definer = 'mydb.owner'@'localhost' PROCEDURE ...
无论哪个用户执行存储过程,它都被模拟为mydb.owner
帐户。
为了指定该过程必须在当前帐户下执行,我添加了以下说明:
CREATE definer = 'mydb.owner'@'localhost' PROCEDURE ...()
SQL SECURITY INVOKER
BEGIN ...
推荐阅读
- database - 添加日期过滤器 Pentaho 报告
- android - 在 AOSP 中对系统服务进行更改后构建哪个目标?
- javascript - Adobe Animate 倒计时到特定日期
- go - golang 频道是基于 LIFO 的吗?
- scala - 隐式解析中的Scala类型约束优先级
- php - Laravel 500 错误没有日志
- php - 使用 eloquent 创建表
- java - 在另一个内部框架java swing后面制作内部框架
- javascript - DataTables.net Excel 导出在 Progressive Web App 中不返回任何结果
- c# - 设置动态生成的 WPF 画布的背景颜色?