存储 elasticsearch 连接的 mojolicious 助手
mojolicious helper storing an elasticsearch connection
我正在 mojolicious 中试验 elasticsearch。
这两方面我都比较陌生。
我想创建一个 helper 来存储 ES 连接,我希望传递与 ES 相关的 helper 配置(例如节点信息,trace_on 文件等)。
如果我编写以下非常简单的帮助程序,它就可以工作;
has elasticsearch => sub {
return Search::Elasticsearch->new( nodes => '192.168.56.21:9200', trace_to => ['File','/tmp/elasticsearch.log'] );
};
然后在启动
$self->helper(es => sub { $self->app->elasticsearch() });
但是,如果我尝试扩展它以获取配置 - 如下所示 -
它失败。当应用程序调用 $self->es->index
时出现错误 "cannot find index on package"
has elasticsearch => sub {
my $config = shift;
my $params->{nodes} = '192.168.56.21:' . $config->{port};
$params->{trace_to} = $config->{trace_to} if $config->{trace_to};
my $es = Search::Elasticsearch->new( $params );
return $es;
};
并在启动中
$self->helper(es => sub { $self->app->elasticsearch($self->config->{es}) });
我想我只是误解了 helpers 或 config 或两者 - 有人可以启发我吗?
仅供参考,在单独的控制器文件中,我按如下方式使用助手;
$self->es->index(
index => $self->_create_index_name($index),
type => 'crawl_data',
id => $esid,
body => {
content => encode_json $data,
}
);
如果我使用上面的简单(第 1)形式创建帮助程序,则效果很好。
我希望这是足够的信息?如果还需要什么,请告诉我?
首先,has
和helper
是不一样的。 has
是一个延迟构建的实例属性。属性构造函数的唯一参数是实例。对于一个应用程序,它看起来像:
package MyApp;
has elasticsearch => sub {
my $app = shift;
Search::ElasticSearch->new($app->config->{es});
};
sub startup {
my $app = shift;
...
}
此实例在首次使用后会在应用程序的整个生命周期内保持不变。我不确定 S::ES 是否有任何掉线重连逻辑,所以你可能需要考虑一下永久对象是否真的是你想要的。
相比之下,助手只是一种方法,可用于应用程序、所有控制器和所有模板(在后一种情况下,作为一个函数)。 helper 的第一个参数是控制器实例,是当前实例还是新实例,具体取决于上下文。因此,您需要像这样构建您的助手:
has (elasticsearch => sub {
my ($c, $config) = @_;
$config ||= $c->app->config->{es};
Search::ElasticSearch->new($config);
});
此机制将按需构建实例并可以接受传入参数,可能用于可选的配置覆盖,如我在该示例中所示。
我希望这能回答你的问题。
我正在 mojolicious 中试验 elasticsearch。
这两方面我都比较陌生。
我想创建一个 helper 来存储 ES 连接,我希望传递与 ES 相关的 helper 配置(例如节点信息,trace_on 文件等)。
如果我编写以下非常简单的帮助程序,它就可以工作;
has elasticsearch => sub {
return Search::Elasticsearch->new( nodes => '192.168.56.21:9200', trace_to => ['File','/tmp/elasticsearch.log'] );
};
然后在启动
$self->helper(es => sub { $self->app->elasticsearch() });
但是,如果我尝试扩展它以获取配置 - 如下所示 - 它失败。当应用程序调用 $self->es->index
时出现错误 "cannot find index on package"has elasticsearch => sub {
my $config = shift;
my $params->{nodes} = '192.168.56.21:' . $config->{port};
$params->{trace_to} = $config->{trace_to} if $config->{trace_to};
my $es = Search::Elasticsearch->new( $params );
return $es;
};
并在启动中
$self->helper(es => sub { $self->app->elasticsearch($self->config->{es}) });
我想我只是误解了 helpers 或 config 或两者 - 有人可以启发我吗?
仅供参考,在单独的控制器文件中,我按如下方式使用助手;
$self->es->index(
index => $self->_create_index_name($index),
type => 'crawl_data',
id => $esid,
body => {
content => encode_json $data,
}
);
如果我使用上面的简单(第 1)形式创建帮助程序,则效果很好。 我希望这是足够的信息?如果还需要什么,请告诉我?
首先,has
和helper
是不一样的。 has
是一个延迟构建的实例属性。属性构造函数的唯一参数是实例。对于一个应用程序,它看起来像:
package MyApp;
has elasticsearch => sub {
my $app = shift;
Search::ElasticSearch->new($app->config->{es});
};
sub startup {
my $app = shift;
...
}
此实例在首次使用后会在应用程序的整个生命周期内保持不变。我不确定 S::ES 是否有任何掉线重连逻辑,所以你可能需要考虑一下永久对象是否真的是你想要的。
相比之下,助手只是一种方法,可用于应用程序、所有控制器和所有模板(在后一种情况下,作为一个函数)。 helper 的第一个参数是控制器实例,是当前实例还是新实例,具体取决于上下文。因此,您需要像这样构建您的助手:
has (elasticsearch => sub {
my ($c, $config) = @_;
$config ||= $c->app->config->{es};
Search::ElasticSearch->new($config);
});
此机制将按需构建实例并可以接受传入参数,可能用于可选的配置覆盖,如我在该示例中所示。
我希望这能回答你的问题。