我从什么时候返回此查询中的数据?

时间:2014-08-29 00:46:58

标签: node.js tedious

我有这种方法用于查询具有行上事件的数据库。我如何知道所有行何时迭代完毕?

我不确定何时处理完所有行后返回。以下代码似乎会导致问题。

 getData : function(data){
    var connection = new Connection(config);
    var newdata = [];
    var dataset = [];
    connection.on('connect', function(err) {

        var sql = "SELECT * FROM dbo."+data.entity+" WHERE "+data.field+" LIKE '%"+data.params+"%'";

        var Request = require('tedious').Request;
        var request = new Request(sql, function (err, rowCount) {
            if (err) {
                return false;
            } else {
                if (rowCount < 1) {
                    return false;
                }
            }
        });

        request.on('row', function(columns) {

            columns.forEach(function(column) {
                   dataset.push({
                       col: column.metadata.colName,
                       val: column.value
                   });


            });

            newdata.push(dataset);

        });

        request.on('done', function(){
            //connection.close();
            return newdata;
        })

        connection.execSql(request);

    });

},

感谢任何帮助!

1 个答案:

答案 0 :(得分:4)

您不能从异步代码中return,您需要使用回调。将callback参数传递到getData函数,然后在Request回调中调用它。

另外,根据docs,你不应该听done事件;你应该使用Request的回调。相关位:

  

这是一个相对低级别的事件,由   收到TDS完成令牌。 Tedious的大多数用法都可以忽略这一点   事件,应该依赖Request的回调函数来知道什么时候   请求已经完成。

考虑到这一点,你会想要做这样的事情:

getData : function(data, callback){
    var connection = new Connection(config);
    var newdata = [];
    var dataset = [];
    connection.on('connect', function(err) {

        var sql = "SELECT * FROM dbo."+data.entity+" WHERE "+data.field+" LIKE '%"+data.params+"%'";

        var Request = require('tedious').Request;
        var request = new Request(sql, function (err, rowCount) {
            if (err) {
                callback(err);
            } else {
                if (rowCount < 1) {
                    callback(null, false);
                } else {
                    callback(null, newdata);
                }
            }
        });

        request.on('row', function(columns) {

            columns.forEach(function(column) {
                   dataset.push({
                       col: column.metadata.colName,
                       val: column.value
                   });


            });

            newdata.push(dataset);

        });

        connection.execSql(request);

    });

}

然后打电话给你,你做了:

getData(data, function(err, rows) {
    if (err) {
        // Handle the error
    } else if (rows) {
        // Process the rows returned from the database
    } else {
        // No rows returns; handle appropriately
    }
});