2015-04-24 30 views
3

我試圖使它簡單地同步的功能開始之前和功能之後結束連接字符串簡單。請參閱代碼片段,並簡單得到如下輸出:如何使它在節點JS

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

任何積極的答覆將不勝感激。

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

可能重複的[如何在節點js同步](http://stackoverflow.com/questions/29821101/how-to-make-synchronize-in-node-js) –

+0

您的JS具有無效的語法'str + ='行。此外,在異步處理完成之前,您無法添加結束標記。 –

+0

我需要適當的解決方案。但沒有得到任何。任何適當的解決方案將不勝感激。 – user3699262

回答

2

已更新至上次編輯,但以同樣的方式同步代碼是一種不好的做法,稱爲callback hell。更好地使用promisesasync。 你可以傳遞一個回調函數來查詢和迭代的,就像這樣:

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

}); 

更多的是在documentation

+0

我的要求是通過從各種表中獲取數據生成一個完整的XML。我不能爲一張桌子做。我有3個表格,從這3個表格中我需要創建一個xml。我需要發送另一臺服務器。 – user3699262

+0

有幾種方法:使用連接表創建一個SELECT語句,或使用async.js創建三個數組,然後使用它們。 https://www.npmjs.com/package/async – vanadium23

+0

請其不是那樣的,我需要先探索表之前啓動XML字符串,然後將該表的循環中,並置與下表中的數據的字符串。它是一種簡單的連接字符串方式,它不會在節點中發生。 – user3699262

1

首先,你要記住這些查詢將同時運行,所以你必須要麼等待使第二查詢之前的第一個結束(但是這將是低效的),或編寫一個函數,一旦完成,將收集結果。

第二種方式是相當容易的,一旦你習慣來思考它的方式稍有不同。

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

通知您還可以聆聽到這兩個查詢end事件,要知道當所有的行已經被退回。