2016-06-16 44 views
1

我正在尝试将一个应用程序从Dancer迁移到Dancer2。我的想法是将代码分离为使用模板和Ajax(API)调用的路由。如何在不同的串行器之间共享Dancer2应用程序之间的会话数据?

我的基本程序是:

use strict; 
use warnings; 
use FindBin; 
use Plack::Builder; 

use Routes::Templates; 
use Routes::Login; 

builder { 
    mount '/' => Routes::Templates->to_app; 
    mount '/api' => Routes::Login->to_app; 
}; 

我在想,在Routes::Templates包不会有任何串行和Routes::Login包将有JSON序列化。我用

set serializer => 'JSON'; 

Routes::Login包。

不过,我也希望这些共享会话数据,使每个人都有每个文件中常见的应用程序的名字

use Dancer2 appname => 'myapp'; 

。这似乎与串行化遇到麻烦。 Routes::Template路由未正确返回,因为它试图将其编码为JSON。这里的错误:

Failed to serialize content: hash- or arrayref expected (not a simple scalar, use allow_nonref to allow this)

我读过的所有文件,其中包括:

但我仍然没有就如何串行明确被包分开。

回答

0

有没有必要结合您的应用程序使用appname;只要两个应用程序对会话引擎使用相同的配置,会话数据就会共享。 (另外,在serializers are an all-or-nothing prospect Dancer2,让您真正使用两个单独的应用程序)

下面是我给的dancer-users mailing list的例子:

MyApp的/ lib目录/ MyApp.pm

package MyApp; 
use Dancer2; 

our $VERSION = '0.1'; 

get '/' => sub { 
    session foo => 'bar'; 
    template 'index'; 
}; 

true; 

MyApp的/ LIB/MyApp的/ API.pm

package MyApp::API; 
use Dancer2; 

set serializer => 'JSON'; 

get '/' => sub { 
    my $foo = session('foo') // 'fail'; 
    return { foo => $foo }; 
}; 

true; 

MyApp的/ bin中/ app.psgi

#!/usr/bin/env perl 

use strict; 
use warnings; 
use FindBin; 
use lib "$FindBin::Bin/../lib"; 

use MyApp; 
use MyApp::API; 
use Plack::Builder; 

builder { 
    mount '/' => MyApp->to_app; 
    mount '/api' => MyApp::API->to_app; 
}; 

如果您访问/路线,然后在同一浏览器的/api路线,你会得到

{"foo":"bar"} 

表明同一个会话两个请求都使用了变量。

+0

[Dancer2 :: Plugin :: SendAs](https://metacpan.org/pod/Dancer2::Plugin::SendAs)允许您覆盖默认的全有或全无序列化器行为,但这里没有必要,并且我认为当你坚持一个应用程序中所有路由的序列化程序时,事情会变得更加清晰。 – ThisSuitIsBlackNot

+0

我得到这个在测试用例中工作,并将其应用于我的。我想补充一点,为了使测试脚本得到这个工作,你需要确保你保存了cookies并重新发送,如[使用cookies测试Dancer doc]所示(https://metacpan.org/pod /distribution/Dancer2/lib/Dancer2/Manual/Testing.pod#Cookies) –

相关问题