2017-09-22 52 views
0

我想从sql server数据库(我使用mssql模块来做到这一点:https://www.npmjs.com/package/mssql)获取数据并将其发送给Redis。 所以我创建了三个文件:从mssql模块中的异步函数返回数据

  • sql_server.js包含了所有与SQL_SERVER的功能(如连接到数据库和查询)
  • redis.js具有的功能,如连接和设置键/值对的Redis数据库(关键是一个ID和值为SQL_SERVER查询的结果)
  • server.js是调用SQL_SERVER和redis的文件的功能,像一个控制器在主文件

我想流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); 
    } 

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

+0

你能不能添加server.js文件? –

+0

对不起,我忘记了。 – Putxe

回答

1

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

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); 
    } 
}); 

希望它能帮助。

+1

这正是我需要的,非常感谢! – Putxe