Putxe
Putxe

Reputation: 1074

Return data from asynchronous function in mssql module

I am trying to get data from sql server database (I'm using mssql module to do that : https://www.npmjs.com/package/mssql) and send it to Redis. So I have created three files :

I would like to stream the sql_server database and send the result to server.js for each row returned . Then the server.js file will pass the result to redis function that will create the couple key/value.

But I am not very familiar with node.js and I don't know how to return the query result to server.js for each row :

Here is sql_server.js function to stream database

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

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

Hope my explanation is understandable, I need your help to find a way to return the row from sql_server.js to server.js. Thank you !

Upvotes: 0

Views: 453

Answers (1)

Sparw
Sparw

Reputation: 2743

I can advise you to use a callback function to pass your errors or data.

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

And then in your 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);
    }
});

Hope it helps.

Upvotes: 1

Related Questions