How to make it simple in node js
I am trying to simply sync up a concatenated string that starts before the function and ends after the function. Please see the code snippet and simplify its output:
<start_xml>
<products>
<proudct_name>Product1</product_name>
<proudct_name>Product2</product_name>
<proudct_name>Product3</product_name>
</products>
<companies>
<company_name>Product1</company_name>
<company_name>Product2</company_name>
<company_name>Product3</company_name>
</companies>
</start_xml>
Any positive answer will be appreciated.
var mysql = require('mysql');
var connection = mysql.createConnection({
host : 'localhost',
user : DB_USER,
password : DB_PASS,
database : DB_NAME,
});
connection.connect();
var query = connection.query('SELECT * FROM tbl_product limit 0,3');
var str = '<start_xml>';
str += '<products>';
query.on('result', function (row) {
str += '<product_name>' + row.product_name + '</product_name>';
});
str += '</products>';
str += '<companies>';
var query1 = connection.query('SELECT * FROM tbl_employee limit 0,3');
query1.on('result', function (row) {
str += '<company_name>' + row.company_name + '</company_name>';
});
str += '</companies>';
str = '</start_xml>';
console.log(str);
source to share
Updated to last edit, but this is a bad way to sync code in a way called callback hell. Better to use promises or async . You can pass a callback function to request and repeat in it like:
var mysql = require('mysql');
var connection = mysql.createConnection({
host: 'localhost',
user: DB_USER,
password: DB_PASS,
database: DB_NAME,
});
connection.connect();
var query = connection.query('SELECT * FROM tbl_product limit 0,3', function(error, results, fields) {
var str = '<start_xml>';
str += '<products>';
for (var i = 0; i < results.length; i++) {
str += '<product_name>' + results[i].product_name + '</product_name>';
}
str += '</products>';
var query1 = connection.query('SELECT * FROM tbl_employee limit 0,3', function(error, results, fields) {
str += '<companies>';
for (var i = 0; i < results.length; i++) {
str += '<company_name>' + results[i].company_name + '</company_name>';
}
str += '</companies>';
str += '</start_xml>';
console.log(str);
});
});
More details are in the documentation .
source to share
First of all, you must remember that these queries will be executed simultaneously, so you need to either wait for the first one to finish, or make a second query (but this will be ineffective), or write a function that will collect the results as soon as they are finished.
The second way is pretty easy if you get used to a little different thinking.
connection.connect();
var productsFinished = false;
var productsQuery = connection.query('SELECT * FROM tbl_product limit 0,3');
var productsStr = '';
productsQuery.on('result', function (row) {
str += '<product_name>' + row.product_name + '</product_name>';
});
productsQuery.on('end', function() {
productsFinished = true;
complete()
})
var companiesFinished = false;
var companiesStr = '';
var companiesQuery = connection.query('SELECT * FROM tbl_employee limit 0,3');
companiesQuery.on('result', function (row) {
companiesStr += '<company_name>' + row.company_name + '</company_name>';
});
companiesQuery.on('end', function() {
companiesFinished = true;
complete();
});
var complete = function(){
if(productsFinished && companiesFinished){
var str = '<start_xml>';
str += '<products>';
str += productsStr;
str += '</products>;
str += '<companies>';
str += companiesStr;
str += '</companies>;
str += '</start_xml';
console.log(str);
}
}
Note that you also need to listen for the event end
in both requests to know when all rows have already been returned.
source to share