如何使用nodejs从javascript中的方法中调用递归方法?

如何使用nodejs从javascript中的方法中调用递归方法?,javascript,mysql,node.js,Javascript,Mysql,Node.js,我正在尝试建立与MySQL数据库的连接,目前为止,该连接仍在工作,但当我运行nodejs应用程序时,我没有读取/更新数据库中的任何内容,连接会关闭,原因是: 错误:连接丢失服务器已关闭连接 所以我在谷歌上搜索,发现了这个问题。但是我不能让它工作,我认为这是因为我使用的是类而不是函数 以下是我目前拥有的代码: class ConnectionFactory { constructor() { this.connectAndHandleDisconnect(); }

我正在尝试建立与MySQL数据库的连接,目前为止,该连接仍在工作,但当我运行nodejs应用程序时,我没有读取/更新数据库中的任何内容,连接会关闭,原因是:

错误:连接丢失服务器已关闭连接

所以我在谷歌上搜索,发现了这个问题。但是我不能让它工作,我认为这是因为我使用的是类而不是函数

以下是我目前拥有的代码:

class ConnectionFactory {

    constructor() {
        this.connectAndHandleDisconnect();
    }

    connectAndHandleDisconnect() {
        connection = mysql.createConnection(db_config);

        connection.connect(function(err) {
            if(err) {
                console.log('error when connecting to db:', err);
                setTimeout(connectAndHandleDisconnect, 2000);
            }
        });

        connection.on('error', function(err) {
            console.log('db error', err);
            if(err.code === 'PROTOCOL_CONNECTION_LOST') {
                connectAndHandleDisconnect();              // Error pops up from this line
            } else {
                throw err;
            }
        });
    }
}
我收到以下错误消息:

引用错误:未定义connectAndHandleDisconnect


我已尝试将connectAndHandleDisconnect()替换为this.connectAndHandleDisconnect()和self.connectAndHandleDisconnect(),但我不知道如何找到此错误的修复方法。

您需要通过
this
访问方法(或引用具有该方法的实例),如下所示:

类连接工厂{
构造函数(){
this.connect和handledisconnect();
}
connectAndHandleDisconnect(){
connection=mysql.createConnection(db_config);
const self=这个;
connection.connect(函数(err){
如果(错误){
log('连接到数据库时出错:',错误);
设置超时(self.connectAndHandleDisconnect,2000);
}
});
connection.on('error',函数(err){
console.log('db error',err);
如果(err.code==='协议\连接\丢失'){
self.connectAndHandleDisconnect();//从此行弹出错误
}否则{
犯错误;
}
});
}
}

当您使用
时,它很可能不起作用,因为您在
函数(err)
内部使用了
,但问题是
在该范围内指的是
函数(err)
,而不是
连接工厂
,因此
(函数(err){/*…*/})。connectAndHandleDisconnect
不存在。您需要将此绑定到函数体之外。类似地,如果没有将
self
绑定到函数体之外,
self
方法将不起作用。在您问题中给出的示例中,它起作用的原因是因为它们在全局范围内声明了
handleDisconnect
,而您没有在全局范围内声明它,因此,需要根据其作为实例成员的范围对其进行限定。