javascript - NodeJS 错误回调已被调用

标签 javascript node.js

我知道这里存在这个错误,我尝试阅读该代码,但我总是收到此错误:回调已被调用。

我的代码是:

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',... >> 受到影响。

enter image description here

关于javascript - NodeJS 错误回调已被调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46603271/

相关文章:

javascript - Meteor 设置整体模板上下文

javascript - 进行链接时如何使内部函数不超出主函数范围?

javascript - 为 HTML5 验证创建一个 polyfill

node.js - Heroku Node js 部署问题 : Web process failed to bind to $PORT within 60 seconds of launch

node.js - 无法从本地网络上的不同设备访问 Mac 上的 Node 服务器

javascript - 在 Sequelize 中得到很多结果

javascript - 尝试从js中的另一个文件调用变量时出错

javascript - SetTimeout奇怪的执行代码

node.js - Phonegap 3.4.0 无法构建新项目和更新旧项目

node.js - 如何使用 Passport.js 返回到当前哈希位置?