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

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);
    }
  });
};

额外提醒

  1. 我帮你修正了api.js里的一个笔误:原来的res.status(200).send(inkdetails)里的inkdetails应该是results,否则会报变量未定义的错误。
  2. 如果你的项目访问量较大,建议使用MySQL连接池(mysql.createPool)代替单个连接,这样能更高效地管理数据库连接,避免出现连接耗尽的情况。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.12 04:49:11