Node.js跨文件导入MySQL连接报错:connection.query不是函数
解决MySQL连接导入后无法调用
query方法的问题 我帮你分析下这个问题,你遇到的TypeError: connection.query is not a function错误,本质是模块循环引用+初始化顺序导致的:
你的server.js里先创建了MySQL连接,但紧接着就导入了routes模块,而routes又会加载你的api.js。这时候api.js去导入server.js时,server.js还没完成整个模块的初始化——也就是说,你拿到的connection可能是一个还没完全被mysql.createConnection()初始化好的对象,甚至可能只是一个空的导出对象,自然调用不了query方法。
另外,把数据库连接和Express服务器的逻辑混在同一个文件里,本身就容易引发这类依赖顺序的坑。
最稳妥的解决方案:抽离独立的数据库连接模块
把MySQL连接的逻辑单独放到一个文件里,所有需要用连接的地方都从这个文件导入,彻底避开循环引用和初始化顺序的问题。
第一步:新建独立的连接文件
创建db/connection.js(你可以根据自己的目录结构调整路径),内容如下:
const mysql = require('mysql'); // 数据库配置 const config = { host: 'localhost', user: 'root', password: '', database: '<DB name>' }; // 创建连接并导出 const connection = mysql.createConnection(config); connection.connect(err => { if (err) { console.error('数据库连接失败:', err.stack); throw err; // 抛出错误,防止后续使用无效连接 } console.log('成功连接到数据库'); }); module.exports = connection;
第二步:修改server.js,导入新的连接模块
把原来server.js里的连接代码删掉,换成导入新的连接模块:
const express = require('express'); const cors = require('cors'); const bodyParser = require('body-parser'); const app = express(); const port = process.env.PORT || 3001; app.use(cors()); app.use(bodyParser.urlencoded({ extended: true })); app.use(bodyParser.json()); // 导入独立的数据库连接 require('./db/connection'); // 导入路由 const routes = require('./api/routes/routes'); routes(app); console.log('Todo List RESTful API 服务器启动于端口:', port); app.listen(port);
第三步:修改api.js,从新模块导入连接
把api.js里的导入路径改成新的连接模块:
'use strict'; // 从独立的连接模块导入,而不是server.js const connection = require('../../db/connection'); exports.get = function(req, res) { console.log(req.query.printerModel); console.log('进入get方法'); connection.query('select * from inkdetails', (error, results) => { if (!error) { res.status(200).send(results); // 这里你之前写的inkdetails是笔误,应该是results console.log('查询结果:', results); } else { res.status(400).send(error); console.error('查询出错:', error); } }); };
额外提醒
- 我帮你修正了
api.js里的一个笔误:原来的res.status(200).send(inkdetails)里的inkdetails应该是results,否则会报变量未定义的错误。 - 如果你的项目访问量较大,建议使用MySQL连接池(
mysql.createPool)代替单个连接,这样能更高效地管理数据库连接,避免出现连接耗尽的情况。
内容的提问来源于stack exchange,提问作者vikranth
相关产品推荐
相关产品推荐

