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

