Ошибка обратной связи /Strongloop с обратным вызовом функции ssh2 Ошибка: запись ECONNABORTED

Я хочу иметь REST API, который возвращал бы в веб-браузере некоторые выходные данные CLI маршрутизатора Cisco от командных входов Cisco CLI через запрос REST, используя ssh2 и loopback.

Я не могу понять это из-за этих ошибок.

Приведенный ниже код будет работать в течение нескольких миллисекунд, возвращая некоторый правильный и ожидаемый результат, но затем прерывание экземпляра обратной петли на стороне сервера будет прерывать / останавливать.

Обнаружена ошибка:

C:\LOCAL_APPS\Loopback\filedir\node_modules\async\dist\async.js:955
       if (fn === null) throw new Error("Callback was already called.");
                     ^

Error: Callback was already called.
at C:\LOCAL_APPS\Loopback\filedir\node_modules\async\dist\async.js:955:32
at C:\LOCAL_APPS\Loopback\filedir\node_modules\async\dist\async.js:3871:13
at interceptInvocationErrors 
(C:\LOCAL_APPS\Loopback\filedir\node_modules\strong-remoting\lib\remote-
objects.js:713:22)
at C:\LOCAL_APPS\Loopback\filedir\node_modules\loopback-phase\node_modules\async\lib\async.js:154:25
at C:\LOCAL_APPS\Loopback\filedir\node_modules\loopback-phase\node_modules\async\lib\async.js:154:25
at C:\LOCAL_APPS\Loopback\filedir\node_modules\loopback-phase\node_modules\async\lib\async.js:154:25
at C:\LOCAL_APPS\Loopback\filedir\node_modules\strong-remoting\lib\remote-objects.js:679:7
at C:\LOCAL_APPS\Loopback\filedir\node_modules\strong-remoting\lib\http-context.js:305:7
at callback (C:\LOCAL_APPS\Loopback\filedir\node_modules\strong-remoting\lib\shared-method.js:

Stream :: close :: code: 0, signal: undefined
events.js:183
  throw er; // Unhandled 'error' event
  ^

Error: write ECONNABORTED
at _errnoException (util.js:1024:11)
at Socket._writeGeneric (net.js:767:25)
at Socket._write (net.js:786:8)
at doWrite (_stream_writable.js:387:12)
at writeOrBuffer (_stream_writable.js:373:5)
at Socket.Writable.write (_stream_writable.js:290:11)
at Socket.write (net.js:704:40)
at SSH2Stream.ondata (_stream_readable.js:639:20)

В папке common / models / device.js:

'use strict';

module.exports = function(Device) {

Device.getIPInterfaceBrief = function(ipaddr,cb){
var filter = {
    include:{
    relation: 'infosheet',
        scope:{
            fields:['data']
        }
    }
}
var Client = require('ssh2').Client;
var conn = new Client();
conn.on('ready', function() {
console.log('Client :: ready');
conn.exec('show ip int br', function(err, stream) {
  if (err) throw err;
  stream.on('close', function(code, signal) {
    console.log('Stream :: close :: code: ' + code + ', signal: ' + signal);
    conn.end();
  }).on('data', function(data) {
    cb(null,"data: " + 'done')  //or cb(null,"data: " + data)
    console.log('STDOUT: ' + data);
  }).stderr.on('data', function(data) {
    console.log('STDERR: ' + data);
  });
});
}).connect({
  host: ipaddr,
  port: 22,
  username: 'routerusername',
  password: 'passwordhere'
});
console.log("check 1");
};

Device.remoteMethod('getIPInterfaceBrief',{
 description: "Returns the brief interface information of a device",
   accepts:{
   arg:'ipaddr',
   type: 'string',
   required: false
 },
 http:{
   path:'/:ipaddr/getIPInterfaceBrief',
   verb: 'get'
 },
 returns:{
   arg:'interfaceinfo',
   type:'any'
 }
 });
}; //module.exports

REST TEST URL:

http:// localhost:3000/api/adevices/some-ip-here/getIPInterfaceBrief

Через несколько секунд возникла ошибка. API ответил на запрос get REST:

1 ответ

Я временно добавил несколько операторов try catch, так или иначе.

Я думаю, что петля не является частью проблемы.

Надеюсь, вам лучше исправить, поскольку код работает на других машинах, таких как система Linux, но для маршрутизаторов Cisco есть некоторые проблемы со строкой "conn.end".

Добавлена ​​попытка поймать ошибки..

if (err) throw err;
stream.on('close', function(code, signal) {
  console.log('Stream :: close :: code: ' + code + ', signal: ' + signal);
  try {
    conn.end();
  }catch (err){
      console.log("error occured",err);
  }
}).on('data', function(data) {
  console.log('STDOUT: ' + data);
}).stderr.on('data', function(data) {
  console.log('STDERR: ' + data);
});

Мой тест зафиксировал ошибку, см. Здесь

Другие вопросы по тегам