Node.js使用mysql2/promise报错connection.connect不是函数且查询结果为undefined
问题根因
- 你引入的是
mysql2/promisepromise风格的依赖包,mysql.createConnection在promise版本下返回的是Promise对象,你没有加await等待连接初始化,拿到的connection不是实际的数据库连接实例,自然不存在connect方法,触发第一个报错。 - promise版本的
mysql2不需要手动调用connect方法,连接会在createConnection执行完成后自动建立,你混用了回调风格的connect写法,属于API使用错误。 - 查询结果返回undefined是因为代码执行报错进入catch分支,你只在catch中打印了错误信息没有返回值,async函数默认返回undefined。
修复方案
直接替换你的query函数部分代码即可,完整可运行的代码如下:
const express = require('express'); const mysql = require('mysql2/promise'); const app = express(); const query = async (sql) => { let connection; try { // 加await等待连接实例返回 connection = await mysql.createConnection({ host: '127.0.0.1', user : 'root', password:'', database : 'proglang' , port: 3306 }); console.log("connected"); const [results] = await connection.execute(sql); return results; } catch(err) { console.log(err.message); throw err; } finally { // 用完连接主动关闭,避免连接泄漏 if (connection) await connection.end(); } } (async() => { try { const results = await query('SELECT id, name, released_year FROM sprogramming_languages '); console.log(results); } catch(err) { console.log(err); } })(); app.get('/',(req,res) => { res.status(200).json({ message:"welcome", app:"testdb" }) }) const port = 3000; app.listen(port,() => { console.log(`listening on port ${port}... `); })
额外优化建议
如果是频繁查询的业务场景,建议使用连接池代替单次创建连接,性能表现更好:
// 连接池全局仅需初始化一次 const pool = mysql.createPool({ host: '127.0.0.1', user : 'root', password:'', database : 'proglang' , port: 3306, connectionLimit: 10 // 最大连接数可按业务需求调整 }) const query = async (sql) => { const [results] = await pool.execute(sql); return results; }
内容的提问来源于stack exchange,提问作者Jasmine
相关产品推荐
相关产品推荐

