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

报错TypeError: connectDB.query is not a function,求排查解决方法

问题原因

connectDB是一个异步函数,它返回的是Promise对象而非直接的数据库连接实例。你直接调用connectDB.query,相当于在函数本身上查找query方法,该方法不存在,因此抛出TypeError: connectDB.query is not a function。

解决方案

提供两种实用修复方案,可根据场景选择:

方案一:在请求处理中获取连接实例

修改List为异步函数,先执行connectDB()拿到数据库连接对象,再执行查询:

import connectDB from '../db/index.js';

export const List = async (req, res) => {
  const { Line_No } = req.params;
  if (!Line_No) {
    return res.status(400).json({ error: "Line_No is required" });
  }

  try {
    // 获取数据库连接实例
    const db = await connectDB();
    const query = "SELECT * FROM trainlist WHERE Line_No = ? ORDER BY Departure ASC";
    
    db.query(query, [Line_No], (err, data) => {
      if (err) {
        console.log(err);
        return res.json(err);
      }
      console.log("TrainList Fetched");
      return res.json(data);
    });
  } catch (err) {
    console.log(err);
    return res.status(500).json({ error: "Failed to connect to database" });
  }
}

方案二:全局复用单一连接实例

修改数据库连接文件,提前初始化连接并导出实例(适合全局复用场景):

// database connection
import mysql from "mysql2/promise"; // 使用promise版本更适配异步逻辑
import dotenv from "dotenv";

dotenv.config({
  path: "./.env"
});

// 初始化连接并导出
let dbConnection;
(async () => {
  try {
    dbConnection = await mysql.createConnection({
      host: process.env.HOST,
      user: process.env.USER,
      password: "",
      database: process.env.DB_NAME
    });
    console.log(`Database connected : ${process.env.DB_NAME}`);
  } catch (err) {
    console.log("Database connection Error", err);
    process.exit(1);
  }
})();

export default dbConnection;

之后在List函数中直接使用:

import dbConnection from '../db/index.js';

export const List = (req, res) => {
  const { Line_No } = req.params;
  if (!Line_No) {
    return res.status(400).json({ error: "Line_No is required" });
  }

  const query = "SELECT * FROM trainlist WHERE Line_No = ? ORDER BY Departure ASC";

  dbConnection.query(query, [Line_No], (err, data) => {
    if (err) {
      console.log(err);
      return res.json(err);
    }
    console.log("TrainList Fetched");
    return res.json(data);
  });
}
额外优化建议
  • 推荐使用mysql2/promise配合async/await替代回调,避免回调地狱,示例:
// 方案一中可将query改为promise形式
const [data] = await db.query(query, [Line_No]);
console.log("TrainList Fetched");
return res.json(data);
  • 生产环境建议使用连接池mysql2.createPool,避免频繁创建销毁连接带来的性能损耗。

内容的提问来源于stack exchange,提问作者Thisal Thewmika

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.14 04:35:17