报错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
相关产品推荐
相关产品推荐

