javascript - Building JSON with Node.js with multiple queries - Stack Overflow

admin2025-04-19  2

I have just started coding with node.js, I understand that node.js is asynchronous but not sure how to deal with this problem.

I'm querying mysql and building a JSON as follows,

var mysql = require('mysql');
var connection = mysql.createConnection({
    host : 'localhost',
    user : 'root',
    password : 'root',
    port : '3306',
    database : 'tango_prod'
});

connection.connect();
var postsJSON = { };
var arr = new Array();

connection.query('SELECT * FROM posts LIMIT 100', function(err, rows) {
    for(i=0; i < rows.length; i++){
        var post_obj = {};
        var post = rows[i];
        post_obj.id = post.id
        post_obj.actor = build_actor(post.author_id); 
        arr.push(post_obj);
    }
    console.log(JSON.stringify(arr));
});

function build_actor(actor_id){
    connection.query('SELECT * FROM people WHERE id ='+actor_id+';', function(err, actor) {
        connection.query('SELECT * FROM users WHERE id ='+actor.owner_id+';', function(err, user) {
          var actor_obj = {};
          actor_obj.id = user.id;
          actor_obj.name = user.name;
          actor_obj.email = user.email;
          return actor_obj
        });
    });
}

connection.end();

I'm getting JSON output and later the build_actor function is getting called. I have to get JSON only after building the actor object.

I have just started coding with node.js, I understand that node.js is asynchronous but not sure how to deal with this problem.

I'm querying mysql and building a JSON as follows,

var mysql = require('mysql');
var connection = mysql.createConnection({
    host : 'localhost',
    user : 'root',
    password : 'root',
    port : '3306',
    database : 'tango_prod'
});

connection.connect();
var postsJSON = { };
var arr = new Array();

connection.query('SELECT * FROM posts LIMIT 100', function(err, rows) {
    for(i=0; i < rows.length; i++){
        var post_obj = {};
        var post = rows[i];
        post_obj.id = post.id
        post_obj.actor = build_actor(post.author_id); 
        arr.push(post_obj);
    }
    console.log(JSON.stringify(arr));
});

function build_actor(actor_id){
    connection.query('SELECT * FROM people WHERE id ='+actor_id+';', function(err, actor) {
        connection.query('SELECT * FROM users WHERE id ='+actor.owner_id+';', function(err, user) {
          var actor_obj = {};
          actor_obj.id = user.id;
          actor_obj.name = user.name;
          actor_obj.email = user.email;
          return actor_obj
        });
    });
}

connection.end();

I'm getting JSON output and later the build_actor function is getting called. I have to get JSON only after building the actor object.

Share edited Aug 23, 2013 at 7:20 karaxuna 26.9k13 gold badges86 silver badges119 bronze badges asked Aug 23, 2013 at 5:57 Srikanth JeevaSrikanth Jeeva 3,0214 gold badges42 silver badges62 bronze badges
Add a ment  | 

2 Answers 2

Reset to default 4

You have to do it asynchronously with callbacks:

connection.query('SELECT * FROM posts LIMIT 100', function(err, rows) {
    for(i=0; i < rows.length; i++){
        build_actor(post.author_id, function(actor){
            var post_obj = {};
            var post = rows[i];
            post_obj.id = post.id
            post_obj.actor = actor;
            arr.push(post_obj);
            if(arr.length === rows.length)
                 console.log(JSON.stringify(arr));
        });
    }
});

function build_actor(actor_id, callback){
    connection.query('SELECT * FROM people WHERE id ='+actor_id+';', function(err, actor) {
        connection.query('SELECT * FROM users WHERE id ='+actor.owner_id+';', function(err, user) {
          var actor_obj = {};
          actor_obj.id = user.id;
          actor_obj.name = user.name;
          actor_obj.email = user.email;
          callback(actor_obj);
        });
    });
}
 var mysql = require('mysql');
 var connection = mysql.createConnection({
 host : 'localhost',
 user : 'root',
 password : 'root',
 port : '3306',
 database : 'tango_prod'
});

connection.connect();
var postsJSON = { };
var arr = new Array();

connection.query('SELECT * FROM posts LIMIT 100', function(err, rows) {
  for(i=0; i < rows.length; i++){
     var post_obj = {};
     var post = rows[i];
     post_obj.id = post.id
     build_actor(post.author_id,function(err,res){

      if(!err){
             post_obj.actor=res;
             arr.push(post_obj);   
             console.log(JSON.stringify(arr));         
        }

     }); 

}

});

function build_actor(actor_id,cb){
    connection.query('SELECT * FROM people WHERE id ='+actor_id+';', function(err, actor) {
    connection.query('SELECT * FROM users WHERE id ='+actor.owner_id+';', function(err, user) {
       var actor_obj = {};
       actor_obj.id = user.id;
       actor_obj.name = user.name;
       actor_obj.email = user.email;
       connection.end();
       cb (null,actor_obj);
    });
});
}
转载请注明原文地址:http://conceptsofalgorithm.com/Algorithm/1745013842a279968.html

最新回复(0)