Note that there are some explanatory texts on larger screens.

plurals
  1. POBest method to string together variety of DB calls in Node js
    text
    copied!<p>I basically need to make about 3 calls to get the data for a json object.. It basically JSON array of JSON object which have some attributes, one of which is an array of other values selected using a second query, then that one also has an array inside which is selected with another db call.</p> <p>I tried using asyn.concatSeries so that I can dig down into the bottom call and put together all the information I collected for one root json object but that's creating a lot of unexpected behaviour..</p> <p>Example of JSON</p> <pre><code>[ { "item" : "firstDbCall" "children" : [ { "name" : "itemDiscoveredWithSecondDBCall" "children" : [ itemsDiscoveredwith3rdDBCall] }, ] } ] </code></pre> <p>This is really difficult using node.js. I really need to figure out how to do this properly since I have to do many of these for different purposes.</p> <p><strong>EDIT</strong> This is the code i have. There's some strange behaviour with async.concatSeries. The results get called multiple times after each one of the functions finish for each array. So i had to put a check in place. I know it's very messy code but i've been just putting band-aids all over it for the past 2 hours to make it work.. </p> <pre><code>console.log("GET USERS HAREDQARE INFO _--__--_-_-_-_-_____"); var query = "select driveGroupId from tasks, driveInformation where agentId = '" + req.params.agentId + "' and driveInformation.taskId = tasks.id order by driveInformation.taskId desc;"; connection.query(query, function(err, rows) { if (rows === undefined) { res.json([]); return; } if(rows.length&lt;1) { res.send("[]"); return;} var driveGroupId = rows[0].driveGroupId; var physicalQuery = "select * from drives where driveGroupId = " + driveGroupId + ";"; connection.query(physicalQuery, function(err, rows) { console.log("ROWSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSS"); console.log(rows); async.concatSeries(rows, function(row, cb) { console.log("-------------------------------SINGLE ROW-------------------------------------"); console.log(row); if(row.hasLogicalDrives != 0) { console.log("HAS LOGICAL DRIVES"); console.log(row.id); var query = "select id, name from logicalDrives where driveId = " + row.id; connection.query(query, function(error, drives) { console.log("QUERY RETURNED"); console.log(drives); parseDriveInfo(row.name, row.searchable, drives, cb); }); } else var driveInfo = { "driveName" : row.name, "searchable" : row.searchable}; console.log("NO SUB ITEMS"); cb(null, driveInfo); }, function(err, results) { console.log("GEETTTTINGHERE"); console.log(results); if(results.length == rows.length) { console.log("RESULTS FOR THE DRIVE SEARCH"); console.log(results); var response = {"id": req.params.agentId}; response.driveList = results; console.log("RESPONSE"); console.log(response); res.json(response); } }); }); }); }; parseDriveInfo = function(driveName, searchable, drives, cb) { async.concatSeries(drives, function(drive,callback) { console.log("SERIES 2"); console.log(drive); console.log("END OF DRIVE INFO"); var query = "select name from supportedSearchTypes where logicalDriveId = " + drive.id; connection.query(query, function(error, searchTypes) { drive.searchTypes = searchTypes; var driveInfo = { "driveName" :driveName, "searchable" : searchable, "logicalDrives" : drive }; callback(null, driveInfo); }); }, function (err, results) { console.log("THIS IS ISISIS ISISISSISISISISISISISISISIS"); console.log(results); if(results.length === drives.length) { console.log("GOTHERE"); cb(null, results); } }); </code></pre> <p>}</p>
 

Querying!

 
Guidance

SQuiL has stopped working due to an internal error.

If you are curious you may find further information in the browser console, which is accessible through the devtools (F12).

Reload