0

我在 Node JS 中使用 Tedious 返回一个简单的 SQL 查询:

var Connection = require('tedious').Connection;  
var config = {  
    server: 'myserver.database.windows.net',
    authentication: {
        type: 'default',
        options: {
            userName: 'myusername',
            password: 'mypassword',
            rowCollectionOnDone: true,
            rowCollectionOnRequestCompletion: true
        }
    },
    options: {
        encrypt: true,
        database: 'mydatabase'
    }
};  
const connection = new Connection(config);  
connection.on('connect', function(err) { 
    if (err) {
        console.log(err);
    }else{
        console.log("Connected");  
    }
});  

var Request = require('tedious').Request  
var TYPES = require('tedious').TYPES;  
let results = [];

function checkId(cid) {  
    request = new Request("SELECT * FROM mytable WHERE id = @cid",function(err, rowCount, rows) {
        if (err) {
            console.log(err);
        }
    });  
    
    request.addParameter('cid', TYPES.NVarChar, cid);  
    request.on('row', function(row) {
        results.push(row);
    });
    console.log(results) // I can see results array perfectly here
    connection.execSql(request); 
    //return callback(null, results); // Tried setting callback as parameter too in this function but got error "callback is not a function"
}  

当我像这样在外面调用语句函数时:

var sqlquery = new checkId(passid);
console.log(sqlquery);

我得到:

"sqlquery {}"

换句话说,一个[object Object]但为空(显然,JSON.strinfigy 为空是没用的)。我已经尝试使用回调作为上述代码中注释的解决方法,但出现错误,当我调用函数时如何查看结果数组?

4

1 回答 1

0

知道 Tedious 它是异步的并且结果不会按时处理以将它们带到外面(原因为什么它是空对象)并且因为在任何地方都没有具体的答案(很多理论是的,但由于没有明确的解释奇怪的是,有些代码已经过时了,就像您将回调用作集合函数一样,没有关于如何正确混合 Promise 和 Tedious 的指导,答案仅在 console.log 中显示结果,或者有些人可能是同步的初学者/ async 概念),我在这里发布了一个对我有用的评论方式,以防万一有人需要它:

///Connection
    var Connection = require('tedious').Connection;  
    var config = {  
        server: 'myserver.database.windows.net',
        authentication: {
            type: 'default',
            options: {
                userName: 'myusername',
                password: 'mypassword',
                rowCollectionOnDone: true,
                rowCollectionOnRequestCompletion: true
            }
        },
        options: {
            encrypt: true,
            database: 'mydatabase'
        }
    };  
    const connection = new Connection(config);  
    connection.on('connect', function(err) { 
        if (err) {
            console.log(err);
        }else{
            console.log("Connected");  
        }
    });  
    var Request = require('tedious').Request  
    var TYPES = require('tedious').TYPES;  

现在,在异步函数中,您可以使用参数调用此示例查询(必须在异步函数中才能使用“返回等待”并且所有内容都同步以避免空数据:

    async your_function(){
                var id = 'id you want or user inputs';
                const allData = [];
                // We now set the promise awaiting it gets results
                await new Promise((resolve,reject) => {
                    const request = new Request("SELECT * FROM table WHERE field = @id", function(err, rowCount) {
                         if (err) {
                             return reject(err);
                         } else {
                             console.log(rowCount + ' rows');
                         }
                     });
                     
                     request.addParameter('id', TYPES.NVarChar, id); //Param id declaration
                     request.on('row', function(columns) {
                         columns.forEach(function(column) {
                             allData.push(column.value); //Push the result to array
                         });
                     });
             
                     request.on('doneProc', function (rowCount, more, returnStatus, rows) {
                         console.log('onDoneProc');
                         return resolve(allData); //Here we resolve allData using promise in order to get it´s content later
                     });
             
                     connection.execSql(request);
             
                 });

                 var mydata = allData;  // Now You can assign it or use the same object as well
    }

希望它能像对我一样帮助别人。

于 2022-01-04T22:18:54.380 回答