Mysql Wait和async在递归函数中不起作用

Mysql Wait和async在递归函数中不起作用,mysql,node.js,typescript,node-mysql,Mysql,Node.js,Typescript,Node Mysql,我正在尝试将代码连接到MySQL。当第一次尝试连接失败时,我希望它重新尝试连接。 所以,这段代码使用的是递归函数 此代码包含数据库连接进程 const mysql=require'mysql'; 让连接; 设cnt=0; 导出常量cm_dbconnect=async=>{ 让结果=假; var dbInfo={ 主持人:“127.0.0.1”, 用户:'**', 密码:'***********' } 设db=mysql.createConnectionBinfo; const attemptCo

我正在尝试将代码连接到MySQL。当第一次尝试连接失败时,我希望它重新尝试连接。 所以,这段代码使用的是递归函数

此代码包含数据库连接进程

const mysql=require'mysql'; 让连接; 设cnt=0; 导出常量cm_dbconnect=async=>{ 让结果=假; var dbInfo={ 主持人:“127.0.0.1”, 用户:'**', 密码:'***********' } 设db=mysql.createConnectionBinfo; const attemptConnection=async=>{ console.log“正在尝试连接到数据库” db.connectasync函数错误{ 如果出错{ cnt+=1; console.log“连接到数据库时出错,请在1秒后重试…” 破坏 如果碳纳米管{ 设置超时=>{ cm_dbconnect; 解决方案 }, 1000; }} 等待settimeoutpromise; } } } } 等待尝试连接 module.exports=db; 结果=真 返回{result:result,errCode:,errDetail:}; } 此代码包含控制器

导出常量控制器=异步=>{ 让连接=等待cm_dbconnect; 设db=require; 让sql='从***中选择***;'; db.querysql,函数错误,结果,字段{ 控制台。日志结果; } console.logaaaa; console.logconnect; } 设测试=控制器; 但是,在重试完成之前返回结果。我认为这就是为什么wait/async不起作用的原因

Attempting to connect to db
aaaa
{ result: true, errCode: '', errDetail: '' }
Error connecting to database, try again in 1 sec...
1
undefined
Attempting to connect to db
Error connecting to database, try again in 1 sec...
2
Attempting to connect to db
Error connecting to database, try again in 1 sec...
3
Attempting to connect to db
Error connecting to database, try again in 1 sec...
4
Attempting to connect to db
Error connecting to database, try again in 1 sec...
如果5次连接失败,我想在重试后获得返回值。
请告诉我解决方案。

您可以更改创建连接的方式:

const mysql = require('mysql');

const cm_dbconnect =  async() => {
  
    var dbInfo = {
      host     : '127.0.0.1',
      user     : '****',
      password : '**********'
    }

    let db =  mysql.createConnection(dbInfo);
  
    try
    {
              await new Promise((resolve, reject) => {
            db.connect(err => {
                return err ? reject(err) : resolve({status: 'OK', message: 'Connected to DB'})
              })
           })
           
          
    }
    catch(err)
    {
        ...handle errors...
    }

  module.exports  = cm_dbconnect;

在控制器中:

const cm_dbconnect = require('path')
export const Controller = async () => {
   
    let connect = await cm_dbconnect();
    let count;
// already called once 
    while( connect.err && count < 4) {
        count++;
        connect = await cm_dbconnect();
    }
    
   if( connect.err && count >=4) return 'DB not connected at the moment'
  
    console.log(`Connected with DB after this many tries`);
          
    let db = require('');
    let sql = 'select *** from ***;';
    db.query(sql, function (error, results, fields) {
    console.log(results);
      
    })
    
    console.log("aaaa");
    console.log(connect);


       }
let test = Controller();

我已经更改了DB连接以获得基于连接的承诺,在控制器中,我们正在检查返回的内容


您也可以检查线程,它也有很好的方法来解决问题。

您希望实现什么?看起来您并没有返回promise实例,而是在connect.Sorry中使用then获取其值。我彻底地修复了程序。如果5次连接失败,我想在重试后得到返回值。非常感谢。我可以在cm_dbconnect函数中编写rooppretry进程吗?如果可能的话,我想保持控制器的简单。是的,您可以编写它并制作一个不同的函数,这有助于使用db连接重试。如果答案有帮助,你可以接受并接受它。谢谢非常感谢。让我问你几个问题。connect.err不工作,因为“无法读取未定义的属性'err'。2.我希望重试间隔为1秒。所以,settimeout函数可以被使用,我应该在哪里插入这个函数呢?Connect.err只是一个伪代码,用来确保循环只在出现错误时运行。