You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何让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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.07 08:02:41