javascript - 从mssql模块中的异步函数返回数据

标签 javascript sql-server node.js asynchronous

我正在尝试从 sql server 数据库获取数据(我正在使用 mssql 模块来执行此操作: https://www.npmjs.com/package/mssql )并将其发送到 Redis。 所以我创建了三个文件:

  • sql_server.js包含与sql_server相关的所有功能(例如连接数据库和查询)
  • redis.js有连接、给redis数据库设置key/value等功能(key是ID,value是sql_server查询的结果)
  • server.js是调用sql_server和redis文件的函数并充当 Controller 的主文件

我想流式传输 sql_server 数据库并将返回的每一行的结果发送到 server.js。 然后 server.js 文件将结果传递给 redis 函数,该函数将创建键/值对。

但是我对node.js不是很熟悉,我不知道如何将每一行的查询结果返回到server.js:

这里是sql_server.js函数来流式传输数据库

      execRequests: function(requestEntry, flux){
    try{            
        const request = new sql.Request(pool)
        request.stream = true // You can set streaming differently for each request 
        request.query(requestEntry)// or request.execute(procedure) 

        request.on('recordset', columns => {
            //console.log(columns); 
        })

        request.on('row', row => {
            // THAT I AM DOING FOR NOW
            //redisMethods.setValue(JSON.stringify(row), flux);
            // THAT I WOULD LIKE TO TO
            //return row;
        })

        request.on('error', err => {
            // May be emitted multiple times 
        })

        request.on('done', result => {
            console.log("done for flux :" + flux);
        })



    } catch (err){
        console.log(err);
    }
}

这是server.js

    sqlMethods.connection().then(function(pool){
    try{
        if(pool._connected){
            console.log("Connected to SQL Server database : " + pool.config.database);
            // connection to redis database
            redisMethods.connection();
            // get the requests to execute
            sqlMethods.getRequests().then(function(requestArray){
                // loop over the array containing requests
                for (var i in requestArray){
                    let request = requestArray[i].requete; //extract the request
                    let flux = requestArray[i].flux; //extract the flux name
                    sqlMethods.execRequests(request, flux).then(function(result){
                       // redisMethods.setValue(JSON.stringify(result), flux);
                    });
                }
            });
        }
    } catch (err){
        console.log(err);
    }

希望我的解释是可以理解的,我需要您的帮助来找到一种将行从 sql_server.js 返回到 server.js 的方法。 谢谢!

最佳答案

我可以建议您使用回调函数来传递错误或数据。

   execRequests: function(requestEntry, flux, callback){
    const request = new sql.Request(pool);
    request.stream = true; // You can set streaming differently for each request 
    request.query(requestEntry); // or request.execute(procedure) 

    var errors = [];
    var rows = [];

    request.on('recordset', columns => {
        //console.log(columns); 
    });

    request.on('row', row => {
        // THAT I AM DOING FOR NOW
        //redisMethods.setValue(JSON.stringify(row), flux);
        // THAT I WOULD LIKE TO TO
        //return row;
        rows.push(row);
    });

    request.on('error', err => {
        // May be emitted multiple times 
        errors.push(err);
    });

    request.on('done', result => {
        console.log("done for flux :" + flux);
        callback(errors, rows);
    });
}

然后在你的 server.js 中

sqlMethods.connection().then(function(pool) {
    try {
        if (pool._connected) {
            console.log("Connected to SQL Server database : " + pool.config.database);
            // connection to redis database
            redisMethods.connection();
            // get the requests to execute
            sqlMethods.getRequests().then(function (requestArray) {
                // loop over the array containing requests
                for (var i in requestArray) {
                    let request = requestArray[i].requete; //extract the request
                    let flux = requestArray[i].flux; //extract the flux name
                    sqlMethods.execRequests(request, flux, function (errors, rows) {
                        if (errors && errors.length) {
                            // There is errors
                        }
                        else if (rows && rows.length) {
                            // There is no errors but rows
                        }
                    });
                }
            });
        }
    } catch (err) {
        console.log(err);
    }
});

希望有帮助。

关于javascript - 从mssql模块中的异步函数返回数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46361073/

相关文章:

javascript - 在 ascx 页面中使用 jquery 删除之前弹出警报,用于在 onClientClick 中调用链接按钮

sql-server - PATINDEX 列的所有值

sql - 在SQL中按子字符串查找字符串的最快方法?

node.js - Couchdb 大小管理

javascript - 如何强制正则表达式验证所选的 <option> 标记?

javascript - 按值对 JavaScript 对象排序

javascript - 如何从托管bean调用javascript函数?

sql - 获取 SQL Server 中每个 id 的计数

javascript - 为什么 Node crypto 会为同一个字符串返回不同的值?

node.js - 在 Redis 中存储对象(nodeJS)有很多变化