gpt4 book ai didi

mysql - Node.js express 和 mySQL 数据

转载 作者:行者123 更新时间:2023-11-30 21:46:50 25 4
gpt4 key购买 nike

我刚开始学习 JavaScript 和 Node.JS,我真的很难理解回调的概念。所以我继续尝试实现它们以将 mySQL 数据推送到站点。

我是这样开始的:

// connection stuff happened already. Connection works fine.

app.get('/home', function(req,res){

var sql = `select u.* from users u`;

var sql2 = `select u.* from users2 u`;

usersA = [];
usersB = [];
connection.query(sql, function(error, results, fields){
if (error) throw error;
results.forEach(function(user){
usersA.push({
"id":user.id,
"name":user.name,
"lastname":user.lastname
});
});
connection.query(sql2, function(error, results, fields){
if (error) throw error;
results.forEach(function(user){
usersB.push({
"id":user.id,
"name":user.name,
"lastname":user.lastname
});
});
res.render("index", {
usersA: usersA,
usersB: usersB
});
});
});
});

这行得通。但我觉得这是错误的方法,因为可能有超过 2 个查询。

我需要在呈现索引之前填充两个数组。而且我想更直接地实现这一点,而无需在彼此之间嵌套多个查询。

也许我只是不习惯那样编写代码。如果即使对于 10 个或更多查询这也是一种有效的方法,我也会坚持使用它。就是感觉不对。

所以我开始研究 this SO thread并试图以某种方式让事情正常进行,但没有成功:

function executeQuery(query, callback) {
connection.query(query, function (err, rows, fields) {
if (err) {
return callback(err, null);
} else {
return callback(null, rows);
}
})
}

function getResult(query,callback) {
executeQuery(query, function (err, rows) {
if (!err) {
callback(null,rows);
} else {
callback(true,err);
}
});
}

function getUsers(sqlQry){
getResult(sqlQry,function(err,rows){
if(!err){
return rows;
} else {
console.log(err);
}
});
}

准备好后,我尝试了以下操作:

var sql = `select u.* from users u`;
var sql2 = `select u.* from users2 u`;

app.get('/home', function(req,res){
res.render("index", {
usersA: getUsers(sql),
usersB: getUsers(sql2)
});
}

但是我的 usersA/usersB 是空的。我猜这是某种作用域/异步问题,因为 getUsers() 在执行查询之前返回。

据我目前所读的内容来看,这可能是 promises 的好地方。

我在我的解决方案中添加了一个答案。

最佳答案

我找到了问题的答案

我找到了 this article关于使用 promises 的 Node.js 和 mySQL 的 codeburst,并尝试了它。所以所有的功劳都归功于他们。

app.get('/home', function(req,res){
var db = new Database({
host : "someHost.someDomain",
user : "someUser",
password : "somePassword",
database : "someDatabase"
});

var sql = `select u.* from users u`;
var sql2 = `select u.* from users2 u`;

usersA = [];
usersB = [];

db.query(sql)
.then(rows => {
rows.forEach(function(user){
usersA.push({
"id":user.id,
"name":user.name,
"lastname":user.lastname
});
});
return db.query(sql2)
})
.then(rows => {
rows.forEach(function(user){
usersB.push({
"id":user.id,
"name":user.name,
"lastname":user.lastname
});
});
return db.close();
}, err => {
return db.close().then( () => { throw err; } )
})
.then( () => {
res.render("index", {
usersA: usersA,
usersB: usersB
});
}).catch( err => {
console.log(err);
} )

真的还不明白它是如何工作的,但我会读一读。这允许使用 promise 处理多个嵌套查询,这比简单地嵌套所有内容更容易处理。

如果有人有其他方法或觉得有必要解释这里发生的事情,我将非常感激!

为了在不访问 URL 的情况下完成这里提到的数据库类:

class Database {
constructor( config ) {
this.connection = mysql.createConnection( config );
}
query( sql, args ) {
return new Promise( ( resolve, reject ) => {
this.connection.query( sql, args, ( err, rows ) => {
if ( err )
return reject( err );
resolve( rows );
} );
} );
}
close() {
return new Promise( ( resolve, reject ) => {
this.connection.end( err => {
if ( err )
return reject( err );
resolve();
} );
} );
}
}

关于mysql - Node.js express 和 mySQL 数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49053681/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com