Javascript amqplib,checkQueue()在出现错误时使我的应用程序崩溃

Javascript amqplib,checkQueue()在出现错误时使我的应用程序崩溃,javascript,node.js,amqp,Javascript,Node.js,Amqp,我正在用express编写一个injestor服务,以接收请求并将其传递到rabbit MQ 我似乎无法优雅地避开checkQueue()错误。每次我点击它们,我的整个应用程序都会因为这个错误而崩溃 events.js:141 throw er; // Unhandled 'error' event ^ Error: Channel closed by server: 404 (NOT-FOUND) with message "NOT_FOUND - no queue 'asdfasd

我正在用express编写一个injestor服务,以接收请求并将其传递到rabbit MQ

我似乎无法优雅地避开checkQueue()错误。每次我点击它们,我的整个应用程序都会因为这个错误而崩溃

events.js:141
  throw er; // Unhandled 'error' event
  ^

Error: Channel closed by server: 404 (NOT-FOUND) with message "NOT_FOUND - no queue 'asdfasdfb' in vhost '/'"
  at Channel.C.accept (/app/node_modules/amqplib/lib/channel.js:406:17)
  at Connection.mainAccept [as accept] (/app/node_modules/amqplib/lib/connection.js:63:33)
  at Socket.go (/app/node_modules/amqplib/lib/connection.js:476:48)
  at emitNone (events.js:67:13)
  at Socket.emit (events.js:166:7)
  at emitReadable_ (_stream_readable.js:411:10)
  at emitReadable (_stream_readable.js:405:7)
  at readableAddChunk (_stream_readable.js:157:11)
  at Socket.Readable.push (_stream_readable.js:110:10)
  at TCP.onread (net.js:523:20)
这是一段让我悲伤的AMQP代码

.post(function(req, res) {
var promise =  new Promise(function(resolve, reject){

  var queue = req.body.queue;
  if ( typeof(queue) == 'undefined' || queue.length == 0 ) return reject("No Queue Specified");

  // need to add VALID JSON CHECK
  var message = req.body.message;
  if ( typeof(message) == 'undefined' || message.length == 0 ) reject("No Message Specified");

  // select the Awknoledgement of the queue.
  var noAck = req.body.ack || true;

  // select the durabiltiy of the queue. Custing issues in the below if different hten when created.
  var durableOpt = req.body.durable || false;

  var assertOpt = {durable: durableOpt};

  var sendOptions = {
    noAck: noAck,
    contentType: 'application/json' };

  amqp.connect( process.env.QUEUE_HOST , function(err, conn) {

    if (err) return reject(err);

    conn.createChannel(function(err, ch) {
      if (err) return reject(err);

      var check = new Promise(function(resolve, reject){
        ch.checkQueue(queue, function(err,ok){
          if (err != null){
            return reject(err);
          } else {
            return resolve(true);
          }
        })
      })

      var assert = new Promise(function(resolve, reject){
        ch.assertQueue( queue , assertOpt, function(err,ok){
          if (err != null){
            return reject(err);
          } else {
            return resolve(true);
          }
        })
      })

      Promise.all( [ check , assert ] ).then(function( values ){

        for (var i = 0; i < values.length; i++) {
          if (values[i] !== true){
            reject(values[i])
          }
        }

        if( ch.sendToQueue(queue, new Buffer( JSON.stringify( message ) ) , sendOptions) == true){
          return resolve('message added');
        }

      }) // end Promise.all
    }) // end conn.createChannel
  }) // end amqp.connect
}) // end of promise.

promise.then(
function(response){
  res.status(200).json(response);
},
function( error ){
  res.status(400).json(error);
})
})
.post(功能(请求、恢复){
var承诺=新承诺(功能(解决、拒绝){
var queue=req.body.queue;
if(typeof(queue)=‘未定义’| | queue.length==0)返回拒绝(“未指定队列”);
//需要添加有效的JSON检查
var消息=req.body.message;
如果(typeof(message)=‘未定义’| | message.length==0)拒绝(“未指定消息”);
//选择队列的awknowledgement。
var noAck=req.body.ack | | true;
//选择队列的持续时间。如果创建时存在不同的问题,请在下面列出。
var durableOpt=req.body.durable | | false;
var assertOpt={durable:durableOpt};
变量sendpoptions={
诺克:诺克,
contentType:'application/json'};
amqp.connect(process.env.QUEUE_主机,函数(err,conn){
如果(错误)返回拒绝(错误);
conn.createChannel(函数(错误,通道){
如果(错误)返回拒绝(错误);
var检查=新承诺(功能(解决、拒绝){
ch.checkQueue(队列,函数(err,ok){
if(err!=null){
退货拒绝(err);
}否则{
返回resolve(true);
}
})
})
var assert=新承诺(函数(解析、拒绝){
ch.assertQueue(队列,assertOpt,函数(err,ok){
if(err!=null){
退货拒绝(err);
}否则{
返回resolve(true);
}
})
})
所有([检查,断言])然后(函数(值){
对于(变量i=0;i

如果我在checkQueue中遇到了这个错误,或者我在AssertQueue中确实遇到了错误。它总是与上面描述的错误一起崩溃。通道总是关闭,并得到一个events.js:141错误。有没有办法防止电话中的错误扼杀我的频道?或者,当出现错误时,我需要在运行中重新连接它吗

我不确定,但似乎您调用
返回拒绝(err)超出承诺范围

试试这个代码

amqp.connect(process.env.QUEUE\u主机,函数(err,conn){
if(err)返回console.log(err);
conn.createChannel(函数(错误,通道){
if(err)返回console.log(err);
var检查=新承诺(功能(解决、拒绝){
>
ch.checkQueue(队列,函数(err,ok){
if(err!=null){
退货拒绝(err);
}否则{
返回resolve(true);
}
})
})
var assert=新承诺(函数(解析、拒绝){
>
ch.assertQueue(队列,assertOpt,函数(err,ok){
if(err!=null){
退货拒绝(err);
}否则{
返回resolve(true);
}
});
})
所有([检查,断言])然后(函数(值){
console.log(值);
if(ch.sendToQueue(队列,新缓冲区(JSON.stringify(message)),sendpoptions)==true){
返回解析(“添加消息”);
}
})
});

})
我找到了导致问题的原因。。。康恩抛出了一个错误,我没有“正确地”捕捉。我尝试了一个标准的try/catch,但它也不喜欢这样

在浏览了一段时间后,我在“事件”下找到了它,我想这是有道理的,但是如果有错误处理标签就好了

conn.on('error', function(handle){
  reject(handle);
})

您确定,如果(err)返回reject(err),您不能呼叫吗-在承诺之外的第二排?对不起,我不知道你在这附近的什么地方…啊,对不起,我明白奥尤的意思了。是的,我已经更新了,仍然是同样的错误。我认为问题在于AMQP协议,当服务器出错时,它会关闭我的连接。因此,我需要在我的任何代码运行之前,以某种方式捕获关闭并重新打开连接。啊,抱歉,这不是完整的代码片段,上面有更多的逻辑,让我在这里为您发布全部内容。具体来说,是给定的代码导致isuesUpdated原始post带有full expres.post()方法。