Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/entity-framework/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 将冗长的连接作为参数传递_Sql_Node.js_Tedious - Fatal编程技术网

Sql 将冗长的连接作为参数传递

Sql 将冗长的连接作为参数传递,sql,node.js,tedious,Sql,Node.js,Tedious,我正在尝试使用一套简单的函数来访问Microsoft SQL Server,这些函数是利用冗长的库构建的。这是我的“工具”文件: 我在服务器文件中调用这些函数,如下所示 const sqlTools = require('./sqlTools.js'); var connection = sqlTools.connectSQL(config); sqlTools.executeSQL(connection, "select * from dbo.test"); 但是,即使在调用函数sqlT

我正在尝试使用一套简单的函数来访问Microsoft SQL Server,这些函数是利用冗长的库构建的。这是我的“工具”文件:

我在服务器文件中调用这些函数,如下所示

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

var connection = sqlTools.connectSQL(config);

sqlTools.executeSQL(connection, "select * from dbo.test");
但是,即使在调用函数sqlTools.executeSQL之前让程序休眠10秒,我也会收到错误“TypeError:无法读取未定义的属性'execSql'(显然不理想)

我可以通过调用sqlTools.connectSQL函数中的请求(在“/*----*/”)来实现这一点,但我想重新使用繁琐的连接来进行多次调用。有什么建议吗?谢谢

~~~~~~~~~编辑~~~~~~~~~~

在akinjide的帮助下,我能够实现回调,允许我对SQL数据库进行一次调用。然而,我正在努力履行承诺,随后再打电话。我将我的“工具”文件更改为:

'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',因为它在第二次调用时无法识别连接。有什么建议吗?

更好的方法是将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);
   });
});

connectSQL
函数不返回任何内容。。。请参阅可能的副本,感谢您的回复!这很有帮助,但我想知道如何重新使用连接(如果我正在构建一个RESTful应用程序的话)。我在网上看到了这个例子,但它每次都会重新启动连接,我无法想象这是多么理想,然后将承诺作为
promise.then(函数(连接){console.log(连接)})
重用。但我知道你可以在需要的时候关闭连接并打开。我在最初的问题中添加了一些额外的代码,在那里我尝试实现承诺,但只取得了部分成功。如果你有任何想法,请告诉我,谢谢!
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);
   });
});