Javascript amqplib,checkQueue()在出现错误时使我的应用程序崩溃
我正在用express编写一个injestor服务,以接收请求并将其传递到rabbit MQ 我似乎无法优雅地避开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
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()方法。