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

      

+3


source to share


2 answers


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 .

+2


source


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.

+1


source







All Articles