gpt4 book ai didi

javascript - amqplib,checkQueue()在错误命中时使我的应用程序崩溃

转载 作者:搜寻专家 更新时间:2023-11-01 00:39:26 25 4
gpt4 key购买 nike

我正在用 express 编写一个服务注入(inject)器,以接收请求并将它们传递给 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);
})
})

如果我曾经在 checkQueue 中遇到该错误,或​​者我实际上在 AssertQueue 中有错误。它总是因上述错误而崩溃。 channel 总是关闭,并出现 events.js:141 错误。有什么方法可以防止调用错误导致我的 channel 中断?或者我是否需要在发生错误时即时重新连接它?

最佳答案

我发现了导致问题的原因...conn 抛出一个错误,我没有“正确”捕获我尝试了标准的 try/catch,但它也不喜欢那样。

在挖掘 docs 之后有一段时间我在“事件”下找到了它,我想这是有道理的,但最好是标记错误处理。

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

关于javascript - amqplib,checkQueue()在错误命中时使我的应用程序崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40229195/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com