我知道这里存在此错误,我尝试读取该代码,但我总是遇到此错误:已经调用了回调。
我的代码是:
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节点js库中是否存在错误,或者我做错了什么?
答案 0 :(得分:1)
事件听众被组织成一个阵列;关于你的代码,对象&lt;&lt; conn&gt;&gt;是您使用的方法的外部。当你调用它两次时,你将一个新的监听器添加到对象conn的监听器数组中,使两个监听器&lt;&lt; .on(&#39; error&#39;,...&gt;&gt;而不是一。见下图(https://nodejs.org/api/events.html)
所以你只需要初始化对象&lt;&lt; conn&gt;&gt;在与它建立连接之前,确保只有一个监听器&lt;&lt; on(&#39;错误&#39;,...&gt;&gt;受到影响。