在Mojolicious :: Lite下以适当的格式渲染错误

时间:2012-11-22 12:55:52

标签: perl mojolicious mojolicious-lite

我有一个under语句,可能会生成错误(例如,身份验证错误)。我全面使用内容协商,我想以适当的格式返回under内的错误。示例代码:

under sub {
  my $self = shift;

  # Authenticated
  my $token = $self->param('token') || '';
  return 1 if $token eq '123456';

  # Not authenticated
  $self->respond_to(
    json => {
      json => { error => 'Invalid authentication token.' },
      status => 401
    },
    text => {
      text => 'Unauthorized.',
      status => 401
    }
  );
  return undef;
}

我可以在render内使用under,但respond_to将不起作用。可能under可以为此工作。但在那种情况下,我该怎么办?

1 个答案:

答案 0 :(得分:1)

Galileo我有一个auth_fail帮助器,它可以做到这一点。在制作示例时,请查看该代码(以及if_authorif_admin under)。

这里有一个例子,在您可以重定向到失败处理程序之前,结果是(至少对于此机制),您需要flash格式,这使得它可用于下一个处理程序

#!/usr/bin/env perl

use Mojolicious::Lite;

any '/fail' => sub {
  my $self = shift;
  $self->respond_to(
    json => {
      json => { error => 'Invalid authentication token.' },
      status => 401
    },
    text => {
      text => 'Unauthorized.',
      status => 401
    }
  );
};

under sub {
  my $self = shift;

  # Authenticated
  my $token = $self->param('token') || '';
  return 1 if $token eq '123456';

  # Not authenticated
  $self->flash( format => $self->param('format') );
  $self->redirect_to('fail');
  return undef;
};

any '/private' => sub {
  my $self = shift;
  $self->respond_to(
    json => {
      json => { launch_codes => '9999999' },
    },
    text => {
      text => 'Launch Code: 9999999',
    }
  ); 
};

app->start;