Javascript mysql2中的承诺
最近我想学习Node.js来帮助我找到工作,所以我启动了一个网页抓取应用程序 我从mysql包开始,但在编写代码之后,我没有想到这是一个异步过程 然后我发现mysql2有承诺,但我不确定我是否理解如何正确使用它们,我的做法很糟糕 这是我的密码Javascript mysql2中的承诺,javascript,mysql,node.js,mysql2,Javascript,Mysql,Node.js,Mysql2,最近我想学习Node.js来帮助我找到工作,所以我启动了一个网页抓取应用程序 我从mysql包开始,但在编写代码之后,我没有想到这是一个异步过程 然后我发现mysql2有承诺,但我不确定我是否理解如何正确使用它们,我的做法很糟糕 这是我的密码 const mysql = require('mysql2'); const pool = mysql.createPool({ ... }); var categorias = []; var querySQL; /* Here goes web
const mysql = require('mysql2');
const pool = mysql.createPool({ ... });
var categorias = [];
var querySQL;
/*
Here goes web scraping stuff not needed in this question
*/
pool.getConnection(function(err, connection){
if(err) throw err;
querySQL = "SELECT 1 FROM Categories LIMIT 1";
connection.promise().query(querySQL).then(([rows,fields])=> {
if (rows!=undefined) {
console.log("The table already exist");
}else {
querySQL = "CREATE TABLE Categories (id INT AUTO_INCREMENT PRIMARY KEY, name VARCHAR(20))";
connection.query(querySQL,function(err,rows,field){
if(err) throw err;
console.log("The table has been created");
console.log(rows);
});
}
})
.catch(console.log)
.then( ()=> {
querySQL = "SELECT x FROM y";
connection.promise().query(querySQL).then(([rows,fields])=> {
/*
More stuff
*/
})
.catch(console.log)
.then( ()=> console.log("Promise ended") );
});
});
问题是我是否做得很好,或者有其他方法,因为这段代码是创建数据库的表(如果没有),然后插入数据。在每次网站更新内容的第一次插入之后,我将创建一个临时表来检查是否有一个新的类别,对象。。。因此,这让我在这个承诺中有了更多的承诺。我建议尝试异步/等待语法,它使事情更具可读性 这应该满足您的愿望:
async function tableExists(pool, tableName) {
try {
const query = `SELECT 1 FROM ${tableName} LIMIT 1;`;
await pool.execute(query);
return true;
} catch (err) {
return false;
}
}
async function createdb() {
const mysql = require('mysql2/promise');
const config = {
host: 'host',
user: 'username',
password: 'password_goes_here',
database: 'some_database'
}
const pool = mysql.createPool(config);
let tableOk = await tableExists(pool, "categories");
if (tableOk) {
console.log("Table 'Categories' already exists.");
return;
}
console.log("Table 'Categories' does not exist, creating...");
try {
const createQuery = "CREATE TABLE Categories (id INT AUTO_INCREMENT PRIMARY KEY, name VARCHAR(20));";
await pool.execute(createQuery);
console.log("Table created successfully.");
} catch (err) {
console.error("Table creation failed:", err);
}
pool.end();
}
createdb();
你们的承诺能让你们的链子拴得更牢一点,这篇文章帮助我更好地理解承诺 您应该避免嵌套承诺,您可以返回承诺的值来链接它们 我会像这样把你的承诺结构弄平
pool.getConnection(function(err, connection){
if(err) throw err;
var querySQL = "SELECT 1 FROM Categories LIMIT 1";
return connection.promise().query(querySQL)
.then((results)=> {
if (results.rows!=undefined) {
console.error("The table already exist");
throw "The table already exist";
}
else {
let querySQL = "CREATE TABLE Categories (id INT AUTO_INCREMENT PRIMARY KEY, name VARCHAR(20))";
return connection.query(querySQL);
}
})
.then((err, rows,) => {
if(err) throw err;
console.log("The table has been created");
console.log(rows);
return rows;
})
.catch(console.log)
.finally(()=> {
var querySQL = "SELECT x FROM y";
return connection.promise().query(querySQL)
})
.then((results, error) => {
/*
More stuff
*/
return nextPromise;
// .then( ()=> console.log("Promise ended") );
})
.then(() =>{
console.log("Promise ended")
})
});
catch语句之后的
then
函数,是否意味着要在catch语句之后继续?好的,我喜欢这种方法,因为它更清晰,所以如果我想在这方面进行更多查询,我可以使用它们创建一个函数,并在createdb中使用它们,对吗?哦,当然,是的。我认为async/await语法读起来更像是同步代码,而且它比链接承诺处理程序更容易理解。当然,您可以传入参数并返回行!很高兴能帮上忙!快乐编码!!另一个答案在我看来更清晰,但谢谢你的文章和代码,当我对承诺有疑问时,它将非常有用