MySQL NodeJs - 让 rows.each 工作的正确方法
MySQL NodeJs - Proper way to get rows.each to work
当我寻找简单的例子时,每个人的风格似乎都大不相同。我尝试了 2 种不同的样式,并遇到了 2 个不同的问题。在下面的代码中,我已经确定了代码的来源以及它在注释中遇到的错误。我分别注释掉或取消注释每个部分和 运行,但每个部分都有自己的错误。 "console.log(rows); " 语句正在显示数据,因此查询本身 运行 正在运行。
// 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
});
数组的 .each
方法不存在,您应该改用 .forEach(function (element, index) {...})
使用以下内容:
rows.forEach( function(element, index) {
console.log(element.ID + " " + element.user_nicename);
});
它们当然相似,但也有区别。例如,"forEach" 是一个数组方法,但是“$.each”可以用在任何类型的集合上。 "forEach" 是内置的,而“$.each”需要加载 jQuery 库。
在这里得到了答案:[https://github.com/sidorares/node-mysql2/issues/999[1]。 .forEach、.each 或 .map 的问题在于您在另一个不是异步函数的函数中,这意味着您不能使用 "await" 调用另一个异步例程。
for (let r=0; r < rows.length; ++r) {
console.log(rows[r].ID + " " + rows[r].user_nicename);
await UpdatePassword(connection, rows[r].ID);
}
他还提供了这个替代方案:
一种 "functional" 类似于 map 的顺序迭代方式(imo 比 for 循环的可读性稍差):
await rows.reduce( async (previousPromise, row) => {
await previousPromise;
return UpdatePassword(row.ID);
}, Promise.resolve());
当我寻找简单的例子时,每个人的风格似乎都大不相同。我尝试了 2 种不同的样式,并遇到了 2 个不同的问题。在下面的代码中,我已经确定了代码的来源以及它在注释中遇到的错误。我分别注释掉或取消注释每个部分和 运行,但每个部分都有自己的错误。 "console.log(rows); " 语句正在显示数据,因此查询本身 运行 正在运行。
// 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
});
数组的 .each
方法不存在,您应该改用 .forEach(function (element, index) {...})
使用以下内容:
rows.forEach( function(element, index) {
console.log(element.ID + " " + element.user_nicename);
});
它们当然相似,但也有区别。例如,"forEach" 是一个数组方法,但是“$.each”可以用在任何类型的集合上。 "forEach" 是内置的,而“$.each”需要加载 jQuery 库。
在这里得到了答案:[https://github.com/sidorares/node-mysql2/issues/999[1]。 .forEach、.each 或 .map 的问题在于您在另一个不是异步函数的函数中,这意味着您不能使用 "await" 调用另一个异步例程。
for (let r=0; r < rows.length; ++r) {
console.log(rows[r].ID + " " + rows[r].user_nicename);
await UpdatePassword(connection, rows[r].ID);
}
他还提供了这个替代方案:
一种 "functional" 类似于 map 的顺序迭代方式(imo 比 for 循环的可读性稍差):
await rows.reduce( async (previousPromise, row) => {
await previousPromise;
return UpdatePassword(row.ID);
}, Promise.resolve());