Я пытаюсь использовать простой набор функций, созданный с использованием библиотеки Tedious, для доступа к Microsoft SQL Server. Вот мой файл "инструментов":
'use strict';
const tedious = require('tedious');
const q = require('q');
var Connection = tedious.Connection;
var Request = tedious.Request;
module.exports = {
connectSQL : function(config) {
var connection = new Connection(config);
connection.on('connect', function(err) {
if (err) {
console.log('FAIL ON CONNECT');
console.log(err);
} else {
try {
/* ----- */
return connection;
} catch (err) {
console.log(err);
return;
}
}
});
connection.on('error', function(err) {
if (err) {
console.log('FAIL ON ERROR');
console.log(err);
} else {
console.log("Error called with no err object.");
}
});
},
executeSQL: function(connection, requestString) {
var results = [];
var request = new Request( requestString , function(err, data) {
if (err) {
console.log(err);
} else {
console.log( data );
}
});
request.on('row', function(row) {
//console.log(row);
results.push( row );
});
request.on('requestCompleted', function(){
console.log('Finished');
return results;
});
connection.execSql(request);
}
}
Я вызываю эти функции в файле моего сервера следующим образом.
const sqlTools = require('./sqlTools.js');
var connection = sqlTools.connectSQL(config);
sqlTools.executeSQL(connection, "select * from dbo.test");
Однако я получаю сообщение об ошибке «Ошибка типа: невозможно прочитать свойство« execSql »с неопределенным значением», даже если я переведите программу в спящий режим на 10 секунд перед вызовом моей функции sqlTools.executeSQL (очевидно, не идеальной).
Мне удалось заставить это работать, вызвав запрос в функции sqlTools.connectSQL (в "/ * ----- * /"), но я хочу повторно использовать соединение Tedious, чтобы сделать несколько звонки. Какие-либо предложения? Спасибо!
~~~~~~~ EDIT ~~~~~~~~~~
С помощью akinjide я смог реализовать обратные вызовы, которые позволяют мне сделать один вызов в моей базе данных SQL. Однако я изо всех сил стараюсь выполнить обещания сделать последующие звонки. Я изменил свой файл "tools" следующим образом:
'use strict';
const tedious = require('tedious');
const q = require('q');
var Connection = tedious.Connection;
var Request = tedious.Request;
module.exports = {
connectSQL: function(config) {
var deferred = q.defer();
var connection = new Connection(config);
connection.on('connect', function(err) {
if (err) {
deferred.reject( err );
} else {
deferred.resolve( connection );
}
});
connection.on('error', function(err) {
deferred.reject(err);
});
return deferred.promise;
},
executeSQL: function(connection, requestString, callback) {
var results = [];
const request = new Request(requestString, function(err) {
callback(err);
});
request.on('row', function(row) {
results.push(row);
});
request.on('requestCompleted', function() {
console.log('request completed!');
callback(null, results);
});
connection.execSql(request);
}
}
и я называю этот код следующим образом ...
var promise = sqlTools.connectSQL(config);
promise.then(function (connection) {
sqlTools.executeSQL(connection, "select * from dbo.test", function(err, results) {
if (err) {
console.log(err);
}
console.log(results);
});
}).catch(function (err) {
console.log(err);
}).then(function (connection) {
sqlTools.executeSQL(connection, "select * from dbo.test2", function(err, results) {
if (err) {
console.log(err);
}
console.log(results);
});
}).catch(function(err) {
console.log(err);
});
Это возвращает результаты первого вызова правильно, но, к сожалению, возвращает эту ошибку «TypeError: Невозможно прочитать свойство execSql из undefined» для второго вызова, так как он не распознает соединение во второй раз. Есть предложения?