2013-08-23 3 views
2

Я только что начал кодирование с помощью node.js, я понимаю, что node.js асинхронен, но не уверен, как справиться с этой проблемой.Здание JSON с Node.js с несколькими запросами

Я запрашивая MySQL и построение JSON следующим образом,

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

Я получаю выход JSON и позже функцию build_actor становится называется. Я должен получить JSON только после создания объекта актера.

ответ

3

Вы должны сделать это асинхронно с обратных вызовов:

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

отлично работает :) Спасибо :) –

+0

@Srikanth вы приветствуются :) – karaxuna

1
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); 
    }); 
}); 
} 
Смежные вопросы