MySQL的的NodeJS - 正确的方式来获得rows.each工作(MySQL NodeJs

2019-10-29 14:10发布

当我寻找简单的例子,每个人的风格似乎完全不同。 我试过2种不同的风格,并得到了2点不同的问题。 在下面的代码,我已经确定的代码,它会在注释错误的来源。 我注释掉或取消注释出各个部分,单独运行,但每一个都有它自己的错误。 在“执行console.log(行);”语句显示数据,所以查询本身运行和工作。

// get the client
const mysql = require('mysql2');
const dashline = '---------------------------------';  

console.log (dashline); 
console.log ("Starting test"); 

// create the connection to database
const connection = mysql.createConnection({
  host: 'myhost',
  user: 'myuser',
  password: 'mypass',
  database: 'myDatabase'

});


console.log ("Got the database connection"); 


query = "select ID, user_nicename, user_email from wp_users where user_login = 'admin' limit 3 ";

console.log ("Starting query"); 

// Attempt 1
/*
connection.query(query, function(err, rows, fields){
  if (err) throw err;

  // from: https://html5hive.org/node-js-quickies-working-with-mysql/ 
  // error: SyntaxError: Unexpected token { (on the rows.each line below) 
  rows.each(element, index) {
    console.log(element.ID+ " " + element.user_nicename);
  }
  console.log (dashline); 
  console.log ("Query End"); 
  process.exit();   // Else Node hangs and must hit cntl-break to exit 

});
*/




// Attempt 2 

connection.query(query, function(err, rows, fields){
  if (err) throw err;
  console.log(rows); 
  // Roughly based on example on this page: 
  // https://datatables.net/reference/api/each()
  // TypeError: rows.each is not a function 
  rows.each( function(element, index) {
    console.log(element.ID + " " + element.user_nicename);
  });
  console.log (dashline); 
  console.log ("The end"); 
  process.exit();   // Else Node hangs and must hit cntl-break to exit 
});

Answer 1:

该方法.each对数组不存在,你应该使用.forEach(function (element, index) {...})而不是



Answer 2:

使用以下命令:

  rows.forEach( function(element, index) {
    console.log(element.ID + " " + element.user_nicename);
  });

他们当然是相似的,但也有区别。 例如,“的forEach”是一个阵列的方法,但“$。每个”可以在任何类型的集合一起使用。 而“的forEach”是一个内置的,而“$。每个”需要加载jQuery库。



Answer 3:

这里有一个答案:[ https://github.com/sidorares/node-mysql2/issues/999[1] 。 与.forEach,或。每个.MAP问题是,你是另一个函数,而不是一个异步函数中,这意味着你不能用“等待”来调用另一个异步程序。

for (let r=0; r < rows.length; ++r) {
  console.log(rows[r].ID + " " + rows[r].user_nicename);
  await UpdatePassword(connection, rows[r].ID);
}

他还提供了这样的选择:

一个“功能性”的方式来迭代顺序类似映射(IMO略少可读然后for循环):

await rows.reduce( async (previousPromise, row) => {
  await previousPromise;
  return UpdatePassword(row.ID);
}, Promise.resolve());


文章来源: MySQL NodeJs - Proper way to get rows.each to work