передача утомительного соединения в качестве параметра - PullRequest
0 голосов
/ 11 сентября 2018

Я пытаюсь использовать простой набор функций, созданный с использованием библиотеки 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» для второго вызова, так как он не распознает соединение во второй раз. Есть предложения?

1 Ответ

0 голосов
/ 11 сентября 2018

Лучшим подходом было бы передать функцию стиля обратного вызова node.js в качестве аргумента connectSQL.

return, ключевое слово не будет работать в асинхронной программе.

'use strict';

const tedious = require('tedious');
const Connection = tedious.Connection;
const Request = tedious.Request;

module.exports = {
    connectSQL: function(config, callback) {
        const connection = new Connection(config);

        connection.on('connect', function(err) {
            if (err) {
                callback(err);
            } else {
                callback(null, connection);
            }
        });

        connection.on('error', function (err) {
           callback(err);
        });
    },
    executeSQL: function(connection, requestString, callback) {
        let results = [];

        const request = new Request(requestString, function(err) {
            callback(err);
        });

        request.on('row', function(row) {
            results.push(row);
        });

        request.on('requestCompleted', function(){
            console.log('Finished');
            callback(null, results);
        });

        connection.execSql(request);
    }
}

Тогда вы можете потребовать, используя sqlTools.connectSQL передавая два параметра config и function(err, connection) {}

const sqlTools = require('./sqlTools');

sqlTools.connectSQL(config, function(err, connection) {
   if (err) {
     console.log('FAIL ON CONNECT');
     console.log(err);
   }

   sqlTools.executeSQL(connection, "select * from dbo.test", function (err, results) {
      if (err) {
         console.log(err);
      } 

      console.log(results);
   });
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...