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

Node.js使用mysql2/promise报错connection.connect不是函数且查询结果为undefined

问题根因

  • 你引入的是mysql2/promise promise风格的依赖包,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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 23:06:03