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

Node.js新手求助:导出数据库函数时出现Cannot call method 'connect' of undefined错误

解决Node.js中Cannot call method 'connect' of undefined错误

嘿,我来帮你一步步排查并解决这个问题~

1. 先修正函数导出的语法错误

你在db_function.js里导出is_valid_IP的方式有问题——你把它包装成了一个对象,但语法本身就不正确,而且这样导出后,db.is_valid_IP会是一个对象而非函数,调用时自然会出问题。

把db_function.js改成这样:

var mysql = require('mysql');
var config = require('./config.js');
var con = config.conn;

// 直接把函数赋值给exports.is_valid_IP,不要套对象
exports.is_valid_IP = function(IP, callback) {
  // 先加个判断,避免con是undefined时直接报错
  if (!con) {
    return callback(new Error('数据库连接对象未定义,请检查config.js'));
  }
  
  con.connect(function(err) {
    // 异步回调里别用throw err,会直接搞崩进程,把错误传给callback就行
    if (err) {
      return callback(err);
    }
    con.query("SELECT * FROM server_master", function (err, result, fields) {
      // 用完连接记得关掉,避免连接泄漏
      con.end();
      if (err) return callback(err);
      // 按照规范,callback第一个参数是错误,第二个是结果
      callback(null, result);
    });
  });
};

2. 解决con为undefined的核心问题

错误Cannot call method 'connect' of undefined说明config.conn根本没拿到值,你得确保config.js正确创建并导出了MySQL连接对象。

给你一个config.js的正确示例:

var mysql = require('mysql');

// 填写你的数据库信息
var conn = mysql.createConnection({
  host: 'localhost', // 你的数据库主机地址
  user: '你的数据库用户名',
  password: '你的数据库密码',
  database: '要连接的数据库名'
});

// 把连接对象导出
module.exports = { conn: conn };

3. 几个额外的优化建议

  • 别每次调用都connect:MySQL连接可以复用,或者更推荐用连接池(适合生产环境,能避免连接泄漏):
    // 改成用连接池的写法
    var pool = mysql.createPool({
      host: 'localhost',
      user: '你的用户名',
      password: '你的密码',
      database: '你的数据库',
      connectionLimit: 10 // 连接池最大连接数
    });
    
    exports.is_valid_IP = function(IP, callback) {
      pool.getConnection(function(err, connection) {
        if (err) return callback(err);
        // 这里你可以把IP用在查询里,避免SQL注入
        connection.query("SELECT * FROM server_master WHERE ip = ?", [IP], function (err, result) {
          connection.release(); // 用完把连接放回池里
          if (err) return callback(err);
          callback(null, result);
        });
      });
    };
    
  • 别浪费IP参数:你现在的查询没用到传入的IP,可以改成带参数的查询(用?占位符,避免SQL注入)。
  • 处理错误反馈:在app.js里记得处理错误,别只打印结果:
    var db = require('./db_function.js');
    // ... 其他代码
    app.get('/test',function(req,res){
     var IP = 1;
     db.is_valid_IP(IP,function(err, result){
       if (err) {
         console.error('查询出错:', err);
         return res.status(500).send('服务器内部错误');
       }
       console.log(result);
       res.send(result);
     });
    });
    

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 08:50:58