如何让Node.js中MySQL的Promise化连接正常工作?
嘿,我仔细看了你的代码,找到几个关键问题导致MySQL连接没触发、test2没输出,咱们一步步来解决:
1. 先解决最直接的拼写错误
在mySql.js里,你引入的MySQL模块变量是mySql(首字母大写),但创建连接时却用了小写的mysql——这会直接抛出ReferenceError: mysql is not defined,代码根本走不到console.log('test2')那一行!
修改后的mySql.js代码:
var mySql = require('mysql'); const query = (sql, params = []) => { return new Promise( ( resolve, reject ) => { // 这里把mysql改成mySql,和引入的变量名保持一致 let connection = mySql.createConnection({ host: 'localhost', user: 'root', password: '', database: 'oauth2test' }); console.log('test2'); // 支持参数化查询(后面会说为什么要加这个) connection.query(sql, params, ( err, rows ) => { connection.end(); // 不管成功失败都要关闭连接 if ( err ) { reject( err ); } else { // 把返回结果包装成你代码里期望的{ results: ... }格式 resolve({ results: rows }); } }); }); } module.exports.query = query;
2. 修正结果解析的错误
你在userDB.js的doesUserExist等方法里写了data.results,但原生MySQL query返回的是纯结果数组,不是带results属性的对象。上面修改后的mySql.js已经把结果包装成{ results: rows },这样你的后续代码就能正确拿到数据了。
3. 必须修复的SQL注入风险
你现在直接把用户输入的username、password拼进SQL语句里,这是超级危险的!比如用户输入username: 'test' OR 1=1 --,就能直接绕过验证甚至篡改数据。
赶紧改成参数化查询,比如修改userDB.js里的registerUserInDB:
const registerUserInDB = (username, password) => { return new Promise((resolve,reject) => { // 用?做占位符,第二个参数传参数数组,MySQL会自动处理转义 mySqlConnection.query( 'INSERT INTO users (username, user_password) VALUES (?, SHA(?))', [username, password] ) .then(data => resolve(true)) .catch(error => reject(error)) }) }
其他查询方法(getUserFromCrentials、doesUserExist等)也都要改成这种参数化写法,彻底杜绝注入风险。
4. 优化连接管理(可选但推荐)
你现在每次执行query都新建一个连接,频繁创建销毁连接会拖慢性能,推荐用连接池代替:
// 连接池版本的mySql.js var mySql = require('mysql'); // 创建连接池,自动管理连接复用 const pool = mySql.createPool({ host: 'localhost', user: 'root', password: '', database: 'oauth2test', connectionLimit: 10 // 按需调整连接数 }); const query = (sql, params = []) => { return new Promise( ( resolve, reject ) => { pool.query(sql, params, ( err, rows ) => { if ( err ) { reject( err ); } else { resolve({ results: rows }); } }); }); } module.exports.query = query;
这样就不用手动关闭连接,连接池会自动帮你复用空闲连接,性能会好很多。
调试小技巧
- 可以在
server.js启动时先测试数据库连通性:
const dbCon = require('./subsystem/mySql'); // 测试连接 dbCon.query('SELECT 1') .then(res => console.log('✅ 数据库连接正常')) .catch(err => console.error('❌ 数据库连接失败:', err));
- 在
mySql.js的query函数里加try-catch,捕获意外错误:
const query = (sql, params = []) => { return new Promise( ( resolve, reject ) => { try { // 连接/查询逻辑 } catch (err) { console.error('MySQL操作出错:', err); reject(err); } }); }
按照上面的步骤改完,你的MySQL连接应该就能正常触发,test2也会输出了,同时还解决了安全隐患和性能问题~
内容的提问来源于stack exchange,提问作者Christopher Smith

