未运行MySQL服务时,我的NodeJS应用连接的是哪个数据库?
问题:NodeJS应用显示连接MySQL但本地无服务,实际连接了哪里?
问题背景
在Mac设备上,通过以下命令确认本地未运行MySQL服务:
$ mysql -u root ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/tmp/mysql.sock' (2)
或者
$ mysql -u root -h 127.0.0.1 ERROR 2003 (HY000): Can't connect to MySQL server on '127.0.0.1' (61)
编写的核心NodeJS应用代码如下:
const express = require("express"); const mysql = require("mysql"); // Create connection const db = mysql.createConnection({ host: "localhost", user: "root", password: "" }); // Connect to MySQL db.connect((err) => { // if (err) { // throw err; // } console.log("MySql Connected"); }); // Since we are using the Express module to create the web server, // we create a variable named app that behaves as an object of // the express module. const app = express(); // Listen on port 3000 app.listen("3000", () => { console.log("Server started on port 3000"); });
运行应用后控制台输出:
$ node index.js Server started on port 3000 MySql Connected
疑问:NodeJS应用实际连接的是哪个MySQL服务?
结论与分析
你的NodeJS应用根本没有连接到任何MySQL服务,出现"MySql Connected"的提示是代码逻辑错误导致的:
- 错误处理被注释:你注释掉了
db.connect回调中的错误判断逻辑,无论连接是否成功,代码都会执行console.log("MySql Connected"),这是虚假的成功提示。 - mysql库的行为特性:旧版
mysql包(非mysql2)在调用connect()时,如果没有主动处理错误,不会自动抛出异常,只会静默失败,导致后续代码继续执行。
验证方式
取消注释错误处理代码,重新运行应用:
db.connect((err) => { if (err) { throw err; } console.log("MySql Connected"); });
此时控制台会输出和mysql客户端一致的连接错误,证明确实没有连接到任何MySQL服务。
内容的提问来源于stack exchange,提问作者Chris F
相关产品推荐
相关产品推荐

