如何在Node.js中简化操作

3
我正在尝试简单地同步连接的字符串,该字符串从函数之前开始,到函数之后结束。请查看代码片段,并使其简单化,以便获得如下输出:
<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
可能是如何在Node.js中实现同步的重复问题。 - Aleksandr M
你的JS在str +=行上有无效的语法。此外,在异步处理完成之前,您不能添加闭合标记。 - user663031
我需要一个合适的解决方案,但是没有找到任何一个。非常感谢任何一个合适的解决方案。 - user3699262
1
尝试在调用connection.query()时使用回调函数。 http://www.codediesel.com/nodejs/querying-mysql-with-node-js/ - Grüse
看起来你想从js对象生成XML。尝试在node.js中找到一个XML序列化程序。有几个选择,其中之一是:https://github.com/davidcalhoun/jstoxml - Raphael Müller
2个回答

2

已更新到最新版本,但这种同步代码的方式被称为回调地狱,是不好的实践。最好使用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);
  });

});

更多内容请参考文档


我的需求是从各种表中获取数据并生成整个XML。我不能仅针对单个表执行此操作。我有3个表,需要从这3个表中创建一个XML,然后将其发送到另一个服务器。 - user3699262
有几种方法:可以使用连接表的一条SELECT语句,也可以使用async.js创建三个数组,然后对它们进行操作。https://www.npmjs.com/package/async - vanadium23
请注意,我的需求不是那样的。我需要在探索第一个表之前启动XML字符串,然后在该表的循环内将字符串与下一个表的数据连接起来。这是一种简单的连接字符串逻辑,在节点中无法实现。 - user3699262
Node.js 与其他传统的 web 语言(如php)略有不同。语句不是按照代码中编写的方式执行的。这就是为什么您需要先获取数据,然后同步以拥有所有三个表格,最后再构建您的 xml。 - vanadium23
请看一下代码,我做了一些修改,这将解释我想要的内容。 - user3699262
尝试查看重复的答案,它会带领您想要执行的正确方式http://stackoverflow.com/questions/29821101/how-to-make-synchronize-in-node-js - vanadium23

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事件,以便知道所有行已经返回。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接