能否将Node.js中Tedious的连接与事件监听器抽离至独立模块?
解决Tedious连接事件监听器的模块整合问题
嘿,我明白你想把SQL连接逻辑抽离出来保持主文件整洁的想法——作为新手能想到模块化已经很棒了!你的问题核心是事件监听器放在了makeConnection函数外面,找不到函数内部的connection变量,因为connection是函数的局部变量,外部访问不到。下面给你几个实用的解决方案,都是只用Node.js和Tedious实现的:
方案1:把事件监听器直接放在函数内部(最简单直接)
把connection.on的代码移到makeConnection函数里,这样就能直接访问到局部的connection实例了:
修改后的SQLconnection.js:
var Connection = require('tedious').Connection; exports.makeConnection = function () { var config = { userName: 'XXXXXX', password: 'XXXXXX', server: 'XXXXXX' }; var connection = new Connection(config); // 把事件监听器放到函数内部 connection.on('connect', function(err) { if (err) { console.error('Connection error', err); } else { console.log('Connected'); } }); // 可以把connection返回,方便后续执行查询等操作 return connection; };
main.js无需大改:
var http = require('http'); var sqlmodule = require('./SQLconnection'); http.createServer(function (req, res) { // 调用时可拿到connection实例,后续操作能用得上 const connection = sqlmodule.makeConnection(); }).listen(8080);
方案2:返回Connection实例,让主模块自定义事件处理(更灵活)
如果你想让主模块自己控制连接成功/失败后的逻辑,可以把connection实例返回,然后在main.js里添加事件监听器:
SQLconnection.js:
var Connection = require('tedious').Connection; exports.createConnection = function () { var config = { userName: 'XXXXXX', password: 'XXXXXX', server: 'XXXXXX' }; return new Connection(config); };
main.js:
var http = require('http'); var sqlmodule = require('./SQLconnection'); http.createServer(function (req, res) { const connection = sqlmodule.createConnection(); // 主模块里自定义事件处理逻辑 connection.on('connect', function(err) { if (err) { console.error('Connection error', err); res.writeHead(500, {'Content-Type': 'text/plain'}); res.end('Database connection failed'); } else { console.log('Connected'); res.writeHead(200, {'Content-Type': 'text/plain'}); res.end('Database connected successfully'); } }); }).listen(8080);
这种方式的好处是你可以结合HTTP请求的上下文(比如给客户端返回对应响应)处理连接结果,更贴合Web服务场景。
方案3:用Promise封装连接逻辑(现代异步风格)
如果后续要执行查询等异步操作,用Promise封装会更方便,避免回调嵌套:
SQLconnection.js:
var Connection = require('tedious').Connection; exports.connect = function () { return new Promise((resolve, reject) => { var config = { userName: 'XXXXXX', password: 'XXXXXX', server: 'XXXXXX' }; var connection = new Connection(config); connection.on('connect', function(err) { if (err) { console.error('Connection error', err); reject(err); } else { console.log('Connected'); resolve(connection); } }); }); };
main.js:
var http = require('http'); var sqlmodule = require('./SQLconnection'); http.createServer(async function (req, res) { try { const connection = await sqlmodule.connect(); res.writeHead(200, {'Content-Type': 'text/plain'}); res.end('Database connected successfully'); // 这里可以用connection执行查询等后续操作 } catch (err) { res.writeHead(500, {'Content-Type': 'text/plain'}); res.end('Database connection failed'); } }).listen(8080);
这种方式用async/await让异步代码看起来像同步代码,新手也更容易理解和维护。
内容的提问来源于stack exchange,提问作者Mario Gju
相关产品推荐
相关产品推荐

