我知道这里存在这个错误,我尝试阅读该代码,但我总是收到此错误:回调已被调用。
我的代码是:
switch(data.type) {
case 1:
console.log('blablabla');
break;
case 2:
/* SSH - login */
pool.query('SELECT INET_NTOA(ip) AS ip, pass, server FROM servers WHERE id=?',[data.id], function(err, rows, fields){
/* SSH - connection */
conn.connect({
host: rows[0].ip,
port: '22',
username: 'root',
password: decrypt(rows[0].pass, password)
})
/* SSH - ready */
conn.on('error', function(err) {
/* SSH - connection failed */
return callback('Login To <b>'+rows[0].server+'</b> Failed!');
})
conn.on('end', function() {
/* SSH - closed */
console.log('ssh closed...')
})
conn.on('ready', function() {
console.log('ready to execute terminal commands...')
})
})
break;
})
我第一次调用这个函数时它有效并且我得到了
Login To Server Failed!
我再次调用此函数,但出现此错误:
Error: Callback was already called.
执行 console.log 后,我看到第二次调用此函数时,它被调用了两次,所以这就是为什么会出现有关回调的错误...所以问题是我尝试将回调放在 conn.on 函数之外和内部,但是第二次调用此函数时,我总是遇到此错误。需要将回调放在什么位置,以便函数不会被调用两次?
更新问题:
我看到,当我将 console.log 添加到错误并关闭事件时,每次调用此函数时,我都会收到另一个事件错误并被调用关闭...请参阅:
第一次调用这个函数时我得到:
calling ssh...
error connecting to server...
ssh closed...
第二个调用函数:
calling ssh...
error connecting to server...
error connecting to server...
ssh closed...
ssh closed...
第三次调用函数:
calling ssh...
error connecting to server...
error connecting to server...
error connecting to server...
ssh closed...
ssh closed...
ssh closed...
那么 SSH2 Node js 库中是否存在错误,或者我做错了什么?
最佳答案
事件监听器被组织为一个数组;关于您的代码,对象 << conn >> 是您使用的方法的外部。当你调用它两次时,你会在对象 conn 的监听器数组中添加一个新的监听器,使两个监听器 <<.on('error',... >> 而不是一个。见下图 ( https://nodejs.org/api/events.html )
因此,您只需要在与对象 << conn >> 建立连接之前对其进行初始化,以确保只有一个监听器 << on('error',... >> 受到影响。
关于javascript - NodeJS 错误回调已被调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46603271/