我正在使用Ingy的Plack::Middleware::Cache来缓存我的Plack应用程序的页面请求。不幸的是,对可缓存的URL的第一个请求以“body应该是数组引用或文件句柄”而死亡。
缓存包非常小,所以很容易跟踪问题,但我不确定我有一个很好的解决方法。如果我评论line 57,一切都按预期工作。这可能是有原因的。 Plack request life-cycle有一些我没有真正得到的阶段(尤其是关于'块'的最后一个阶段,可能是最相关的阶段。)
# in my app.psgi
builder {
enable 'Cache', match_url => '[?&]cache',
cache_dir => '/tmp/plack-cache';
# ... some 'mounts'
}
# in Plack::Middleware::Cache
return Plack::Util::response_cb(
$self->app->($env),
sub {
my $cache = shift;
make_path($dir) unless -d $dir;
return sub {
if (not defined $_[0]) {
nstore $cache, $file;
return;
}
$cache->[2] ||= '';
# comment out this line and errors go away!
#$cache->[2] .= $_[0]; # the body is an arrayref sometimes!
return $_[0];
}
}
);
据我所知,body(传递给response_cb的回调的arrayref中的第三个元素)是一个arrayref。放弃那条线我能打破什么?