开发Chrome扩展时Node.js连接MySQL报1049未知数据库错误求助
ER_BAD_DB_ERROR 错误码1049的本质是当前连接的MySQL实例识别不到代码中指定的blinkyblinky数据库,即便你在可视化工具中确认数据库存在,也属于连接配置与实际访问的实例不匹配导致的问题,常见原因和解决方法如下:
大小写敏感问题
Linux系统下MySQL默认对数据库名大小写敏感,Windows系统则默认不敏感。如果你的Node.js服务运行在Linux环境下,先检查数据库实际名称的大小写是否和代码里的blinkyblinky完全一致,有没有出现大写字母拼写差异。
解决方法:把代码中的数据库名调整为和实际名称完全一致,也可以修改MySQL配置文件my.cnf,新增lower_case_table_names=1配置项后重启MySQL服务(该配置会强制所有库表名转为小写,修改前请做好数据备份)。连接的MySQL实例不匹配
你本地可视化工具连接的MySQL实例,和Node.js代码连接的实例不是同一个。常见场景包括本地安装了多个版本的MySQL服务端口不同、用Docker部署MySQL时可视化工具连的是容器内实例而Node.js连的是宿主机实例、测试环境和本地环境实例混淆等。
解决方法:- 在Node.js服务运行的设备上执行命令行登录MySQL:
mysql -h localhost -P 3306 -u root -p,输入密码后执行show databases;,查看返回的库列表中是否存在blinkyblinky - 如果找不到库,就调整代码中
host、port参数,指向实际存储了blinkyblinky库的MySQL实例即可。
- 在Node.js服务运行的设备上执行命令行登录MySQL:
用户权限不足
代码中使用的root用户没有blinkyblinky库的访问权限,或者root用户的登录host限制导致从localhost登录时无法访问该库。
解决方法:登录MySQL后执行以下SQL赋权:GRANT ALL PRIVILEGES ON blinkyblinky.* TO 'root'@'localhost'; FLUSH PRIVILEGES;库名包含不可见字符
新建数据库时如果不小心在名称前后输入了空格或者其他不可见特殊字符,会导致代码中写的纯blinkyblinky无法匹配到实际库名。
解决方法:执行SQLSELECT schema_name FROM information_schema.SCHEMATA WHERE schema_name LIKE '%blinky%';,对比返回的库名和代码中的拼写是否完全一致,有多余字符的话要么修改代码中的库名,要么重命名数据库。Chrome扩展运行环境混淆
Chrome扩展的前端代码运行在浏览器沙箱中,不支持Node.js API,如果你直接把这段数据库连接代码写在扩展的前端脚本里,实际运行时不会走你本地的Node.js环境,连接的localhost会指向当前用户的本地设备,自然找不到你的数据库。
解决方法:单独搭建Node.js后端服务,把数据库连接逻辑放在后端实现,Chrome扩展前端通过HTTP接口和后端交互,不要在扩展前端直接编写数据库连接代码。
内容的提问来源于stack exchange,提问作者Suhail Misbah

