2016-05-28 4 views
0

Im mit Expressjs und MySQL-Paket. Ich habe eine Benutzertabelle, jeder Benutzer könnte viele Fähigkeiten, Projekte, Zertifizierungen in verschiedenen Tabellen gespeichert haben. Wie kann ich alle diese Daten in einem einzigen Benutzerobjekt erhalten?mehrere verschachtelte Callback-Funktionen vor dem Rückruf der Eltern in Javascript

getUserDataById(req.params.id, function (user) { 
    if (user) { 
    res.send(user);  
    } 
} 
var getUserDataById = function (id, callback) { 
    connection.query(userSql, id, function (err, rows) { 
    if (rows[0]) { 
     user = new User(rows[0]); //parse row data to user obj 
     // The main problem 
     //get skills and projects.... and asign to user obj 
     parseArrayData(skillSql, user.id, Skill, function (skills) { 
      user.skills = skills; 
     } 
    ); 
     parseArrayData(projectSql, user.id, Project, function (project) { 
      user.projects = projects; 
     } 
    ); 
     // is here 
     callback(user); 
    } 
    }); 
} 
var parseArrayData = function (query, id, Obj, callback) { 
    connection.pool.query(query, id, function (err, rows) { 
    if (err) { 
     throw err; 
    } else { 
     console.log('rows',rows); 
     var array = []; 
     for (var i = 0; i < rows.length; i++) { 
     array[i] = new Obj(rows[i]); // map obj's attributes with fields 
     }; 
     callback(rows); 
    } 
    });  
}; 

Antwort

0

Sie können diese verschiedenen Tabellen mit Namen haben (an): users, skills, projects, certifications;

Funktion, um das Ergebnis von db für die Abfrage zu erhalten;

function executeQuery(tablename, userId, callback) { 
    var sql = 'select * from ' + tablename + ' where id = ' + userId; 
    connection.query(sql, function (err, rows) { 
    if (err) { callback(err, null); } 
    else { callback(null, rows); } 
    }) 
} 

Funktion, die alle Ergebnisse für die Benutzer-ID abruft und das json-Objekt zurückgibt;

var getUserDataById = function (userId, callback) { 
    executeQuery('users', userId, function(users) { 
     executeQuery('projects', userId, function(projects) { 
      executeQuery('skills', userId, function(skills) { 
      executeQuery('certifications', userId, function(certifications) { 
       var result = { // format you result. 
        id: userId, 
        users: users, 
        projects: projects, 
        skills: skills, 
        certifications: certifications 
       }; 
       callback(result); 
      }); 
      }); 
     }); 
    }); 
    callback(null); 
}); 

Verbrauch:

getUserDataById(req.params.id, function (user) { 
    if (user) { 
    res.send(user);  
    } 
} 
+0

Dank @narainsagar. Dies könnte mir helfen, mein Problem zu lösen. Ich habe festgestellt, dass "Versprechen" in dieser Situation helfen könnte. Ich werde versuchen, es so zu lösen –

+0

cool. Ja, Versprechen ist besser. – narainsagar

+0

Ich habe Rückrufe verwendet, weil Sie es6 nicht erwähnt oder Versprechen in Code verwendet haben. Ihr Code enthielt Callbacks, also habe ich auch Callbacks verwendet – narainsagar