【问题标题】:Perl Dancer2 default route failingPerl Dancer2 默认路由失败
【发布时间】:2020-05-07 03:13:35
【问题描述】:

我不想让 perl dancers 默认 404 “对不起,这是空白。”当找不到匹配的路由时会出现响应。发生这种情况时,我还需要执行一些其他任务,例如错误记录。

这是我在创建默认路线时遵循的舞者文档。 https://metacpan.org/pod/Dancer2::Cookbook#Default-Route

这是我在主要路线文件底部的内容

any qr{.*} => sub {
    status 404;
    template 'test_error_template', { path => request->path };
};

问题是,如果请求的路线无效,我仍然会收到默认的 dancer 404 消息。不知何故,这条路线没有被选中。

如果我尝试去一个不存在的路线,这就是 development.log 中出现的内容

[server:5931] core @2020-01-22 10:31:55> looking for get /non_existing_route in /usr/share/perl5/vendor_perl/Dancer2/Core/App.pm l. 36
[server:5931] core @2020-01-22 10:31:55> Entering hook core.error.init in (eval 230) l. 1
[server:5931] core @2020-01-22 10:31:55> Entering hook core.error.before in (eval 230) l. 1
[server:5931] core @2020-01-22 10:31:55> Entering hook core.error.after in (eval 230) l. 1

有人可以帮忙吗?我确实有多个路由文件,这可能是问题的一部分吗?

谢谢

【问题讨论】:

  • 你还有哪些路线?是否也有不同的包罗万象?还是你在配置文件中设置了错误模板?
  • 您在进行更改后是否重新启动了您的应用程序?您是否在views/ 目录中创建了test_error_template.tt?您是否在环境配置文件中将show_errors 设置为0?尝试取消设置。查看应用程序的日志,看看是否有其他东西正在尝试响应您的请求,然后再全面了解它。您可能应该向我们展示所有代码,以便我们为您提供适当的帮助。
  • @simbabque 还有很多其他路线,但我检查并确保没有其他路线。这是一个拥有数千条生产线的大型生产系统,其他开发人员已经在它上面工作过。未设置错误模板文件。我可以这样做,但我仍然需要在它发生时进行捕捉,以便我可以做一些自定义日志记录和其他事情。
  • @simbabque 在开发环境中我让它在每次页面加载时重新编译以节省重新启动的需要。是 test_error_template.tt 在 vi​​ews/ 中。我还没有在配置中检查 show_errors ,好点。我很乐意提供更多代码,但所有代码都太多了,因为主路由文件超过 6000 行。
  • @ikegami 是的,钩子根本没有被调用。不过我确实发现了一些东西。所以在顶部我有prefix '/u/:user';,如果我删除它,默认路由就起作用了。抱歉,我知道如果我发布了我所有的代码,有人会看到这一点,但还有很多需要修剪的地方,我想让我的 OP 保持干净和直截了当。所以基本上文档中的默认路由示例是在没有 url 前缀的假设下工作的。我只需要弄清楚如何修改它,这样它就会捕获所有内容。

标签: perl dancer


【解决方案1】:

所以在我的情况下,问题是在路由文件中设置了前缀。除非我在 url 中包含前缀,否则不会触发默认路由。例如/myprefix/invalid_route 会调用默认路由,但只调用/invalid_route 不会,从而导致 404 错误。我还没有完全想出一个解决办法,但这至少回答了我最初的问题。

编辑:

解决了。我创建了一个新的路由文件 default.pm,它只包含前缀为“/”的默认路由,并将其放在 app.psgi 的最后。这样,只有在所有其他方法都失败时才能达到。

app.psgi

#!/usr/bin/env perl
use strict;
use warnings;

use main_routes;
use default;
myapp->to_app;

默认.pm

package default;

prefix '/';

any qr{.*} => sub {
    #log and do other stuff here
    return 'my default route';
};

true;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-02-08
    • 2018-02-07
    • 2016-04-02
    • 1970-01-01
    • 1970-01-01
    • 2016-03-27
    • 1970-01-01
    • 2019-08-24
    相关资源
    最近更新 更多