Как разделить переменную между двумя модулями роутеров в кро? - PullRequest
0 голосов
/ 19 октября 2018

Я пытаюсь использовать Cro для создания Rest API, который будет публиковать сообщения в rabbitMQ.Я хотел бы разделить свои маршруты на разные модули и составить их с помощью «include».Но я хотел бы иметь возможность использовать одно и то же соединение с rabbitMQ в каждом из этих модулей.Я пытаюсь с "нашим", но он не работает:

Файл 1:

unit module XXX::YYY;
use Cro::HTTP::Router;
use Cro::HTTP::Server;
use Cro::HTTP::Log::File;
use XXX::YYY::Route1;

use Net::AMQP;

our $rabbitConnection is export = Net::AMQP.new;
await $rabbitConnection.connect;

my $application = route {
        include <api v1 run> => run-routes;
}
...

Файл 2:

unit module XXX::YYY::Route1;
use UUID;
use Cro::HTTP::Router;
use JSON::Fast;
use Net::AMQP;
my $channel = $XXX::YYY::rabbitConnection.open-channel().result;
$channel.declare-queue("test_task", durable=> True );
sub run-routes() is export { ... }

Сообщение об ошибке:

===SORRY!===
No such method 'open-channel' for invocant of type 'Any'

Спасибо!

Ответы [ 2 ]

0 голосов
/ 08 декабря 2018

Ответ @Scimon, безусловно, правильный, но он не затрагивает ОП.С другой стороны, два комментария @ugexe и @raiph точны, поэтому я постараюсь обобщить их здесь и объяснить, что происходит.

Сама ошибка

Это ошибка:

Сообщение об ошибке:

=== К сожалению! === Нет такого метода 'open-channel 'для инвоканта типа' Any '

Указывает, что инвокант ($XXX::YYY::rabbitConnection) имеет тип Any, который обычно назначается переменным, когда они не имеютопределенное значение;то есть, в основном, $XXX::YYY::rabbitConnection не определено.Конечно, это не так, поскольку XXX::YYY не входит в число импортируемых модулей, как указано @ ugexe.

Дополнительная проблема, указанная в OP

Этот модуль был исключен из импортированного списка, поскольку, как обозначено OP

Я определенно кодирую его неправильно, потому что, если я пытаюсь добавить использование XXX :: YYY ;, я получаю ошибку загрузки модуля Circular, обнаруженную

Но конечно.поскольку use XXX::YYY::Route1;, который является файлом 2, включен в файл 1.

Окончательное решение заключается в реорганизации файлов

Эта круговая зависимость, вероятно, указывает на тот факт, что они должны быть в одном и том жефайл, или же общий код должен быть вынесен в третий файл, который в конечном итоге будет включен обоими.Так что у вас должно быть что-то вроде модульного модуля XXX :: YYY :: Common;используйте Net :: AMQP;

our $rabbitConnection is export = Net::AMQP.new;
await $rabbitConnection.connect;

, а затем

use XXX::YYY::Common;

в обоих модулях.

0 голосов
/ 21 октября 2018

Когда вы определяете свою экспортируемую функцию маршрута, вы можете указать аргументы, затем в модуле создания вы можете создать общие объекты и передать их в маршруты.Например, в вашем модуле маршрутизатора:

sub run-routes ($rmq) is export{
    route {
       ... $rmq is available in here
    }
}

Затем в главном маршрутизаторе вы можете создать свою очередь и передать ее при включении

my $rmq = # Insert queue creation code here
include product => run-routes( $rmq );

Я не пробовал это, но могуне вижу причин, почему это не должно работать.

...